如何检查list是否包含任何字符串值

本文关键字:是否 包含任 string 字符串 list 何检查 检查 | 更新日期: 2023-09-27 18:11:08

下面的代码是列表元素。

List <string> lsLinks = new List<string>();

在添加新字符串之前,我想检查列表是否包含我要添加的字符串。我怎样才能用最有效的方法来做这件事呢?

我可以遍历整个列表并检查,但我认为这不是性能明智的

如何检查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)