1

例如说我有以下字符串:

var testString = "你好,世界";

我想调用以下方法:

var newString = testString.Replace("Hello", "").Replace("world", "");

是否有一些代码结构可以简化这一点,这样我只需要指定一次 Replace 方法,并且可以指定一堆参数一次性传递给它吗?

4

10 回答 10

5

使这更具可读性的另一个选择是添加新行和适当的缩进(这对我来说是更好的选择):

var newString = testString.Replace("Hello", "")
                          .Replace("world", "")
                          .Replace("and", "")
                          .Replace("something", "")
                          .Replace("else","");
于 2008-11-27T23:50:10.460 回答
3

创建一个函数,将String和 a传递给该函数Dictionary(String, String)。遍历 Dictionary 和 中的每个项目InputString.Replace(DictionaryEntry.Key, DictionaryEntry.Value)。返回具有替换值的字符串。

.Replace.Replace但如果只有2次,我会这样做......

于 2008-11-27T23:37:58.053 回答
3

在某些语言(例如python)中,存在reduce 或fold 函数的概念——这是一种表示列表中所有元素的循环的功能方式。

使用 reduce 你可以写这样的东西

return reduce(lambda a, x: a.Replace(x, ''), ['hello', 'world'], 初始)

这与

a = 初始
对于 ['hello', 'world'] 中的 x:
    a = a.替换(x,'')
返回一个

在 python 中,您也可以将其发音为

减少(str.replace,['hello','world'],初始)。

当然,这是否更简单完全是另一个问题——但很多人当然喜欢编写这样的代码。

于 2008-11-28T00:37:10.007 回答
2

正如其他帖子中所述,有很多方法。

但通常甜蜜=高效(=可维护)=简单。最好不要尝试,除非您描述问题的上下文有某些原因。

于 2008-11-27T23:42:08.370 回答
1

您提出的任何构造都可能比您的原始帖子更复杂。如果您有很多不同的参数要传递,您可以构建这些参数的向量并在执行调用时对其进行迭代。但是话又说回来,对于您当前的示例,修改后的版本会更长,编写起来也更复杂。两次只是重复率太小。

于 2008-11-27T23:37:49.473 回答
1

您可以创建自己的 Replace 扩展方法,该方法采用 IEnumberable 参数。然后循环遍历迭代器并使用 replace 方法。

然后你可以这样称呼它 .Replace(new string[] {"Matt", "Joanne", "Robert"}, "")

我认为这应该这样做

public static string Replace(this string s, IEnumerable<string> strings, string replacementstring)
{
    foreach (var s1 in strings)
    {
        s = s.Replace(s1, replacementstring);
    }

    return s;
}
于 2008-11-27T23:41:35.767 回答
1

您可以使用正则表达式来执行此操作,例如:

var newString = Regex.Replace(testString, "Hello|world", "");

如果你想从一个序列以编程方式构建正则表达式,它会是这样的:

var stringsToReplace = new[] { "Hello", "world" };
var regexParts = stringsToReplace.Select(Regex.Escape);
var regexText = string.Join("|", regexParts.ToArray());
于 2008-11-28T00:01:44.963 回答
0

我不知道这是否更甜,但你可以这样做:

string inputString = "Hello, world";
string newString = new[] { "Hello", "world" }.Aggregate(inputString, (result, replace) => result.Replace(replace, ""));

这将从输入字符串作为种子开始,并使用每个替换字符串运行该函数。

理解 Aggregate 函数的一个更好的例子可能是:

List<Payment> payments = ...;
double newDebt = payments.Aggregate(oldDebt, (debt, payment) => debt - payment.Amount);
于 2008-11-27T23:56:47.110 回答
0

很多人说你应该使用 IEnumerable 和 List 和 Arrays 等,虽然这完全“可以”,但如果我是你,我宁愿在 C# 中使用 params 关键字。如果我要实现这样的东西 - 我可能不会关心像你的双重替换方法调用这样简单的事情......

于 2008-11-28T00:10:36.380 回答
0

我看到这些模式有几个缺陷 - 首先,字符串是不可变的,多次调用 replace 或在循环中可能很糟糕,特别是如果您的输入字符串很大。如果您一心想要调用 replace,那么至少使用 StringBuilder 类中的 Replace 方法。

于 2008-11-28T00:50:54.537 回答