如何使用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 ){}
但这不起作用,因为错误:"操作符'=='不能应用于"类型的操作数
我做错了什么?
有几种方法。
您可以使用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.
}
因为Tag
是struct
,所以我不建议对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。