如何检查list是否包含任何字符串值
本文关键字:是否 包含任 string 字符串 list 何检查 检查 | 更新日期: 2023-09-27 18:11:08
下面的代码是列表元素。
List <string> lsLinks = new List<string>();
在添加新字符串之前,我想检查列表是否包含我要添加的字符串。我怎样才能用最有效的方法来做这件事呢?
我可以遍历整个列表并检查,但我认为这不是性能明智的
最有效的方法是简单地使用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();
如果你已经让有一个List<string>
,你不能先排序,那么没有什么你能做的,这将比一个简单的Contains
走整个列表更快。如果列表已排序,则可以执行二进制搜索。
如果你可以使用HashSet<string>
来代替,当集合变大时,这显然会快得多。(对于小集合,性能差异可能无关。)
HashSet<T>
不保留元素的顺序-所以如果这对您很重要,您可能希望保留HashSet<string>
和 List<string>
。然后你可以这样做:
if (stringSet.Add(newValue))
{
stringList.Add(newValue);
}
请注意,如果您目前只关心抽象的性能,则应该设置适当的目标,以确定什么足够快,并根据这些目标进行度量——同时编写尽可能简单的代码。您知道这个列表在您的实际应用程序中实际上会变大吗? List <string> lsLinks = new List<string>();
bool contains = lsLinks.Any(s => s.Equals("myString");
您可以使用以下命令:
lsLinks.Contains(myString);
或
lsLinks.Where(o=>o==myString);
但是如果你的目标是确保字符串的唯一性,你可以使用HashSet而不是List,如果字符串的顺序不重要
如果您不关心项的顺序,可以使用HashSet而不是List<>。
我不确定我理解你想要什么,但试试这个:
if(!lsLinks.Contains(NewString)) lsLinks.Add(NewString)