以下代码是list元素。
List <string> lsLinks = new List<string>();
在添加新字符串之前,我想检查列表是否包含我要添加的字符串。我怎样才能以最有效的方式做到这一点。
我可以遍历整个列表并检查,但我认为这不会是性能明智的。
答案 0 :(得分:11)
最有效的方式是简单地使用HashSet<T>
,代替列表(如果顺序无关紧要)或另外到列表中,如果是的话。
即。任
HashSet<string> lsLinks = new HashSet<string>();
// now just Add() all you like; only ever one of each, but order is not defined
或
List<string> lsLinks = new List<string>();
HashSet<string> unique = new HashSet<string>();
// now, when needed, check if the item is new to "unique"
if(unique.Add(newValue)) lsLinks.Add(newValue);
您可能还会在LINQ中找到.Distinct()
的用法,即
var uniqueList = someSourse.Distinct().ToList();
答案 1 :(得分:6)
如果你 拥有List<string>
,而你无法先排序,那么你无能为力,这比简单{{1}更快走遍整个清单。如果列表已排序,则可以执行二进制搜索。
如果您可以使用Contains
,那么随着集合变大,这显然会更快。 (对于小集合,性能差异可能无关紧要。)
请注意,HashSet<string>
确实不保留元素的顺序 - 所以如果这对您很重要,您可能希望保留HashSet<T>
和一个HashSet<string>
。然后你可以这样做:
List<string>
请注意,如果您目前只关注摘要中的性能,则应设置适当的目标以确定足够快的内容,并根据这些目标进行衡量 - 同时编写最简单的代码。您是否知道该列表实际上会在您的实际应用程序中变大?
答案 2 :(得分:2)
List <string> lsLinks = new List<string>();
bool contains = lsLinks.Any(s => s.Equals("myString");
答案 3 :(得分:2)
您可以使用以下内容:
lsLinks.Contains(myString);
或
lsLinks.Where(o=>o==myString);
但是如果您的目标是确保唯一字符串,则可以使用HashSet而不是List, 如果字符串的顺序不重要。
答案 4 :(得分:2)
您可以使用HashSet而不是List&lt;&gt;如果你不关心物品的顺序。该集合特别设计用于比较操作中的最佳速度,因为它使用哈希值。
答案 5 :(得分:1)
我不确定我理解你想要什么,但试试这个:
if(!lsLinks.Contains(NewString)) lsLinks.Add(NewString)