例如说我有以下字符串:
var testString = "你好,世界";
我想调用以下方法:
var newString = testString.Replace("Hello", "").Replace("world", "");
是否有一些代码结构可以简化这一点,这样我只需要指定一次 Replace 方法,并且可以指定一堆参数一次性传递给它吗?
例如说我有以下字符串:
var testString = "你好,世界";
我想调用以下方法:
var newString = testString.Replace("Hello", "").Replace("world", "");
是否有一些代码结构可以简化这一点,这样我只需要指定一次 Replace 方法,并且可以指定一堆参数一次性传递给它吗?
使这更具可读性的另一个选择是添加新行和适当的缩进(这对我来说是更好的选择):
var newString = testString.Replace("Hello", "")
.Replace("world", "")
.Replace("and", "")
.Replace("something", "")
.Replace("else","");
创建一个函数,将String
和 a传递给该函数Dictionary(String, String)
。遍历 Dictionary 和 中的每个项目InputString.Replace(DictionaryEntry.Key, DictionaryEntry.Value)
。返回具有替换值的字符串。
.Replace.Replace
但如果只有2次,我会这样做......
在某些语言(例如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'],初始)。
当然,这是否更简单完全是另一个问题——但很多人当然喜欢编写这样的代码。
正如其他帖子中所述,有很多方法。
但通常甜蜜=高效(=可维护)=简单。最好不要尝试,除非您描述问题的上下文有某些原因。
您提出的任何构造都可能比您的原始帖子更复杂。如果您有很多不同的参数要传递,您可以构建这些参数的向量并在执行调用时对其进行迭代。但是话又说回来,对于您当前的示例,修改后的版本会更长,编写起来也更复杂。两次只是重复率太小。
您可以创建自己的 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;
}
您可以使用正则表达式来执行此操作,例如:
var newString = Regex.Replace(testString, "Hello|world", "");
如果你想从一个序列以编程方式构建正则表达式,它会是这样的:
var stringsToReplace = new[] { "Hello", "world" };
var regexParts = stringsToReplace.Select(Regex.Escape);
var regexText = string.Join("|", regexParts.ToArray());
我不知道这是否更甜,但你可以这样做:
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);
很多人说你应该使用 IEnumerable 和 List 和 Arrays 等,虽然这完全“可以”,但如果我是你,我宁愿在 C# 中使用 params 关键字。如果我要实现这样的东西 - 我可能不会关心像你的双重替换方法调用这样简单的事情......
我看到这些模式有几个缺陷 - 首先,字符串是不可变的,多次调用 replace 或在循环中可能很糟糕,特别是如果您的输入字符串很大。如果您一心想要调用 replace,那么至少使用 StringBuilder 类中的 Replace 方法。