比较两个列表并删除相同列表的最有效方法
Most efficient way to compare two lists and delete the same
我想比较两个列表并将有效的单词放入一个新列表中。
var words = new List<string>();
var badWords = new List<string>();
//this is just an example list. actual list does contain 700 records
words.Add("Apple");
words.Add("Moron");
words.Add("Seafood");
words.Add("Cars");
words.Add("Chicken");
words.Add("Twat");
words.Add("Watch");
words.Add("Android");
words.Add("c-sharp");
words.Add("Fool");
badWords.Add("Idiot");
badWords.Add("Retarded");
badWords.Add("Twat");
badWords.Add("Fool");
badWords.Add("Moron");
我正在寻找比较列表并将所有 'good' 单词放入新列表的最有效方法。 finalList 不应包含 "Moron"、"Twat" 和 "Fool".
var finalList = new List<string>();
或者说没有必要新建一个List?我很高兴听到你的想法!
提前致谢
如果您不想创建新的 List
,您可以使用 RemoveAll()
删除现有 List
中的不良词
words.RemoveAll(badWords.Contains);
你可以使用包含方法
words.Where(g=>!badWords.Contains(g)).ToList()
使用 Enumerable
Except 函数存储在 System.Linq
命名空间
finalList = words.Except(badWords).ToList();
节省时间的最有效方法,也是最快的方法,因为 Except
实现使用 Set
,速度很快
List<string> cleanList = words.Except(badWords).ToList();
这是有效的,因为 Except
使用基于集合的方法。
一种更有效的方法是完全避免将 "bad" 个单词添加到第一个列表中。例如,通过使用 HashSet<string>
和不区分大小写的比较器:
var badWords = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase){ "Idiot", "Retarded", "Twat", "Fool", "Moron" };
string word = "idiot";
if (!badWords.Contains(word))
words.Add(word);
https://msdn.microsoft.com/library/bb908822(v=vs.90).aspx
var words = new List<string>();
var badWords = new List<string>();
//this is just an example list. actual list does contain 700 records
words.Add("Apple");
words.Add("Moron");
words.Add("Seafood");
words.Add("Cars");
words.Add("Chicken");
words.Add("Twat");
words.Add("Watch");
words.Add("Android");
words.Add("c-sharp");
words.Add("Fool");
badWords.Add("Idiot");
badWords.Add("Retarded");
badWords.Add("Twat");
badWords.Add("Fool");
badWords.Add("Moron");
var result = words.Except(badWords).ToList();
编辑:来晚了。
我想比较两个列表并将有效的单词放入一个新列表中。
var words = new List<string>();
var badWords = new List<string>();
//this is just an example list. actual list does contain 700 records
words.Add("Apple");
words.Add("Moron");
words.Add("Seafood");
words.Add("Cars");
words.Add("Chicken");
words.Add("Twat");
words.Add("Watch");
words.Add("Android");
words.Add("c-sharp");
words.Add("Fool");
badWords.Add("Idiot");
badWords.Add("Retarded");
badWords.Add("Twat");
badWords.Add("Fool");
badWords.Add("Moron");
我正在寻找比较列表并将所有 'good' 单词放入新列表的最有效方法。 finalList 不应包含 "Moron"、"Twat" 和 "Fool".
var finalList = new List<string>();
或者说没有必要新建一个List?我很高兴听到你的想法!
提前致谢
如果您不想创建新的 List
,您可以使用 RemoveAll()
List
中的不良词
words.RemoveAll(badWords.Contains);
你可以使用包含方法
words.Where(g=>!badWords.Contains(g)).ToList()
使用 Enumerable
Except 函数存储在 System.Linq
命名空间
finalList = words.Except(badWords).ToList();
节省时间的最有效方法,也是最快的方法,因为 Except
实现使用 Set
,速度很快
List<string> cleanList = words.Except(badWords).ToList();
这是有效的,因为 Except
使用基于集合的方法。
一种更有效的方法是完全避免将 "bad" 个单词添加到第一个列表中。例如,通过使用 HashSet<string>
和不区分大小写的比较器:
var badWords = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase){ "Idiot", "Retarded", "Twat", "Fool", "Moron" };
string word = "idiot";
if (!badWords.Contains(word))
words.Add(word);
https://msdn.microsoft.com/library/bb908822(v=vs.90).aspx
var words = new List<string>();
var badWords = new List<string>();
//this is just an example list. actual list does contain 700 records
words.Add("Apple");
words.Add("Moron");
words.Add("Seafood");
words.Add("Cars");
words.Add("Chicken");
words.Add("Twat");
words.Add("Watch");
words.Add("Android");
words.Add("c-sharp");
words.Add("Fool");
badWords.Add("Idiot");
badWords.Add("Retarded");
badWords.Add("Twat");
badWords.Add("Fool");
badWords.Add("Moron");
var result = words.Except(badWords).ToList();
编辑:来晚了。