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?
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).
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()
As already said, array is a fixed size list. Use the List instead.
IList<string> newWords = new List<string>(oldWords);
Your code is wrong. Instead of
IList<System.String> newWords = new string[oldWords.Count()];
Make this
IList<System.String> newWords = new List<String>();
You do not need to initialize to a certain size with a generic list.
You cannot insert items into a fixed size list, a happy medium would be to create a new list and insert as you "clean".
Following Mike's answer,
public bool IsNoise(String word)
{
return (word.Length <= 2) && validation2 && validation3;
}
public List<String> Clean(List<String> words)
{
words.RemoveAll(IsNoise);
return words;
}
精彩评论