如何修改或添加新项目到通用字符串列表

时间:2010-05-24 12:42:58

标签: c#

我想在单词列表中删除一些漂亮的单词。

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;收集是固定的大小。我如何修改或添加新项目到通用字符串列表?

6 个答案:

答案 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 itMSDN),那么从最后删除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;
}