如何使用Find方法检查c#列表中是否存在一个条目

本文关键字:一个 存在 是否 方法 Find 何使用 检查 列表 | 更新日期: 2023-09-27 18:04:06

我使用c#列表的查找方法如下:

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

列表保存"struct标签",现在我的问题是如何检查标签条目是否存在于列表中。

在MSDN侧,我发现了以下内容:

  • 如果没有找到,那么"类型T的默认值"将为返回。

所以我尝试了以下操作:

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

但这不起作用,因为错误:"操作符'=='不能应用于"类型的操作数

我做错了什么?

如何使用Find方法检查c#列表中是否存在一个条目

有几种方法。

您可以使用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.
}

因为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()成员。


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

如果你只是想检查项目是否存在,你可以使用Contains() from System。Linq:

bool exists = tags.Contains(tag);

这将使用结构相等来比较你的标签。所以换句话说,标签上的所有字段都需要相等(而不仅仅是id)。如果你想指定如何确定相等性,你可以使用重载来传入你自己的IEqualityComparer。

相关文章: