如何使用“查找方法”检查C#列表中是否存在条目

时间:2015-07-22 13:39:01

标签: c# linq list

我通过以下方式使用带有Find方法的C#List:

Tag searchResult = tags.Find(x => x.TagId.Equals(tag));

该列表包含“struct Tag”,现在我的问题是如何检查列表中是否存在标记条目。

MSDN方面,我发现了以下内容:

  • 如果找不到任何内容,则“类型T的默认值”将为 返回。

所以我尝试了以下内容:

if(default(Tag) == searchResult ){}

但由于错误:“运算符'=='无法应用于”

类型的操作数,因此无法正常工作

我错了什么?

3 个答案:

答案 0 :(得分:5)

有两种方法。

您可以使用Enumerable.Any()

if (tags.Any(x => x.TagId.Equals(tag)))
{
    // There's a match.
}

或者,如果您想真正找到相关标记,请使用Enumerable.FirstOrDefault

var tag = tags.FirstOrDefault(x => x.TagId.Equals(tag));
if (tag != null) 
{
    // There exists a tag.
}

答案 1 :(得分:1)

由于Tagstruct,我建议不要对default(Tag)进行测试,因为您不知道是否找不到Tag或碰巧发现Tag具有与default(Tag)相同的默认/空值。

如果没有执行两个共享相同搜索谓词的查询(一个.Any()后跟一个.First()),那么最好的选择可能就是滚动自己的方法。也许是一种返回Nullable<T>的扩展方法,您可以将其用于任何struct

public static T? FirstOrNull<T>(this IEnumerable<T> items, Func<T, bool> predicate) where T : struct
{
    foreach(var item in items)
    {
        if (predicate(item))
            return item;
    }

    return null;
}

使用方式如下:

Tag? searchResult = tags.FirstOrNull(x => x.TagId.Equals(tag));
if (searchResult != null)
{
    //do something with your search result
}

当然,此时它与任何标准Nullable<Tag>(或Tag?)一样,因此您可以使用.HasValue.Value.GetValueOrDefault()成员如你所愿。

编辑:重读你的问题,似乎你要严格要求检查项目是否存在,而不是实际检索它。但是,如果它真的打算检索它,如果它存在并对该标记执行某些操作,那么您要么必须进行两次搜索(首先检查,第二次检索)或使用这样的方法。

答案 2 :(得分:0)

如果您只想查看该项是否存在,可以使用System.Linq中的Contains():

bool exists = tags.Contains(tag);

这将使用结构相等来比较您的标记。换句话说,Tag上的所有字段都必须相等(不仅仅是id)。如果要准确指定应该如何确定相等性,可以使用重载来传入自己的IEqualityComparer。