是否有一种甜蜜,有效的方法可以使用两个不同的参数两次调用相同的方法?

时间:2008-11-27 23:23:31

标签: c# arrays parameters methods call

比如说我有以下字符串:

var testString =“Hello,world”;

我想调用以下方法:

var newString = testString.Replace(“Hello”,“”)。Replace(“world”,“”);

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

10 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

创建一个您传递StringDictionary(String, String)的函数。迭代字典中的每个项目InputString.Replace(DictionaryEntry.Key, DictionaryEntry.Value)。返回带有替换值的字符串。

但如果它只有2次,我就会.Replace.Replace ...

答案 2 :(得分:3)

在某些语言(例如python)中,有一个reduce或fold函数的概念 - 这是一种在列表中所有元素上表示循环的函数方法。

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

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

相同
a = initial
for x in ['hello', 'world']:
    a = a.Replace(x, '')
return a

在python中你也可以发音为

reduce(str.replace, ['hello', 'world'], initial).

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

答案 3 :(得分:2)

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

但通常甜=高效(=可维护)=简单。最好不要尝试,除非有一些理由超出你描述问题的背景。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以创建自己的替换扩展方法,该方法采用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;
}

答案 6 :(得分: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());

答案 7 :(得分:0)

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

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

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

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

List<Payment> payments = ...;
double newDebt = payments.Aggregate(oldDebt, (debt, payment) => debt - payment.Amount);

答案 8 :(得分:0)

很多人都说你应该使用IEnumerable和List and Arrays等,虽然这完全“好”但我宁愿在C#中使用params关键字,如果我是你的话。如果我要实现这样的东西 - 我可能不会因为你的双重替换方法调用那样容易做些事情......

答案 9 :(得分:0)

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