Q:

how can modify or add new item into generic list of strings

i want to remove some pretty words in list of words.
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();
}

but i can't add, remove or insert any thing in list! and exception NotSupportedException occured >> Collection was of a fixed size. how i can modify or add new item into generic list of strings?

A:

Of course LINQ could make it nice and easy:
return words.Where(p => !string.IsNullOrEmpty(CleanNoiseWord(p))
            .Distinct()
            .ToList();

Of course we could take this one step further and inline the function call to CleanNoiseWord and drastically simplify your Clean method:
public IList<System.String> Clean(IList<System.String> words)
{
    return words.Where(p => !string.IsNullOrEmpty(p) && p.Length > 2)
                .Distinct()
                .ToList();
}

If no words meet the criteria in the predicate then an empty list will be returned. If you are passing a very large list and want to lazy evaluate it (MSDN) then remove the ToList() from the end - this way actual evaluation of the list will not be performed until you convert it to an actual list. (To be fair, here's a blog post about some of the gotchas of lazy (deferred) evaluation).

A:

I suggest that you create a method 
  bool IsNoiseWord(string word) 

and do this:
  words.RemoveAll(IsNoiseWord);

edit: this will only work for actual lists, otherwise
 return words.Where(x=>!IsNoiseWord(x)).Distinct().ToList()

A:

As already said, array is a fixed size list. Use the List instead.
IList<string> newWords = new List<string>(oldWords);

