用列表中的每个字符串替换一个字符串



我有一个这样的列表:

List<string> _unWantedWords = new List<string> { "word1", "word2", "word3" };

我有一个像这样的字符串:

string input = "word1mdjw ksjcword2 d word3fjwu";

我想删除输入字符串中不需要的单词,但字符串在c#中是不可变的,所以我想我会用lambda表达式一次性做一些有趣的事情。这样的:

string output = _unWantedWords.Select(x => input.Replace(x, ""));

但是我似乎不能让它工作,你有什么主意吗?:)

丹尼尔

一般情况下任务有一些微妙的问题:

我们可以递归地吗?

"woword1rd1ABC" -> "word1ABC" -> ABC
|   |            |   |
remove        remove again

移除的顺序是什么?如果我们想去除{"ab", "bac"},那么"XabacY"的期望结果是什么?

"XabacY" -> "XacY" // ab removed
-> "XaY"  // bac removed

在最简单的情况下(按_unWantedWords中出现的顺序删除单词,没有递归),您可以输入(让我们使用Linq,因为您已经尝试过Select):

input = _unWantedWords.Aggregate(input, (s, w) => s.Replace(w, ""));        

我们不能改变string本身,但我们可以改变引用(即赋值给input)

您可以使用ForEach代替

_unWantedWords.ForEach(x => { input= input.Replace(x, "")});

您可以使用ForEach函数替换输入中的文本。

string output = input;
_unWantedWords.ForEach(x => output = output.Replace(x, ""));

为了不丢失原始输入,您可以创建另一个变量。

这就是你需要的吗?

List < string > _unWantedWords = new List < string > {
"word1",
"word2",
"word3"
};
string input = "word1mdjw ksjcword2 d word3fjwu";
for (int i = 0; i < _unWantedWords.Count; i++) {
input = input.Replace(_unWantedWords[i], "");
}

DotNet Fiddle: https://dotnetfiddle.net/zoY4t7

你可以直接使用ForEach,在这里阅读更多

_unWantedWords.ForEach(x => {
input = input.Replace(x, "");
});