我想在单词列表中删除一些漂亮的单词。
public System.String CleanNoiseWord(System.String word)
{
string key = word;
if (word.Length <= 2)
key = System.String.Empty;
else
key = word;
//other validation here
return key;
}
public IList<System.String> Clean(IList<System.String> words)
{
var oldWords = words;
IList<System.String> newWords = new string[oldWords.Count()];
string key;
var i = 0;
foreach (System.String word in oldWords)
{
key = this.CleanNoiseWord(word);
if (!string.IsNullOrEmpty(key))
{
newWords.RemoveAt(i);
newWords.Insert(i++, key);
}
}
return newWords.Distinct().ToList();
}
但我无法在列表中添加,删除或插入任何内容!发生异常NotSupportedException&gt;&gt;收集是固定的大小。我如何修改或添加新项目到通用字符串列表?
答案 0 :(得分:9)
当然LINQ可以让它变得简单明了:
return words.Where(p => !string.IsNullOrEmpty(CleanNoiseWord(p))
.Distinct()
.ToList();
当然,我们可以更进一步,将函数调用内联到CleanNoiseWord
,并大大简化Clean
方法:
public IList<System.String> Clean(IList<System.String> words)
{
return words.Where(p => !string.IsNullOrEmpty(p) && p.Length > 2)
.Distinct()
.ToList();
}
如果没有单词符合谓词中的条件,则返回空列表。如果您要传递一个非常大的列表并想要lazy evaluate it(MSDN),那么从最后删除ToList()
- 这样,在您转换列表之前,不会执行对列表的实际评估到一个实际的清单。 (公平地说,here's a blog post关于懒惰(延期)评估的一些问题。)
答案 1 :(得分:4)
我建议你创建一个方法
bool IsNoiseWord(string word)
并执行此操作:
words.RemoveAll(IsNoiseWord);
编辑:这只适用于实际列表,否则
return words.Where(x=>!IsNoiseWord(x)).Distinct().ToList()
答案 2 :(得分:3)
如前所述,数组是一个固定大小的列表。改为使用列表。
IList<string> newWords = new List<string>(oldWords);
答案 3 :(得分:2)
你的代码错了。而不是
IList<System.String> newWords = new string[oldWords.Count()];
制作本
IList<System.String> newWords = new List<String>();
您无需使用通用列表初始化为特定大小。
答案 4 :(得分:1)
您无法将项目插入到固定大小的列表中,一个快乐的媒介就是创建一个新列表并在“清理”时插入。
答案 5 :(得分:1)
按照迈克的回答,
public bool IsNoise(String word)
{
return (word.Length <= 2) && validation2 && validation3;
}
public List<String> Clean(List<String> words)
{
words.RemoveAll(IsNoise);
return words;
}