我通过以下方式使用带有Find方法的C#List:
Tag searchResult = tags.Find(x => x.TagId.Equals(tag));
该列表包含“struct Tag”,现在我的问题是如何检查列表中是否存在标记条目。
在MSDN方面,我发现了以下内容:
所以我尝试了以下内容:
if(default(Tag) == searchResult ){}
但由于错误:“运算符'=='无法应用于”
类型的操作数,因此无法正常工作我错了什么?
答案 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)
由于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()
成员如你所愿。
编辑:重读你的问题,似乎你要严格要求检查项目是否存在,而不是实际检索它。但是,如果它真的打算检索它,如果它存在并对该标记执行某些操作,那么您要么必须进行两次搜索(首先检查,第二次检索)或使用这样的方法。
答案 2 :(得分:0)
如果您只想查看该项是否存在,可以使用System.Linq中的Contains():
bool exists = tags.Contains(tag);
这将使用结构相等来比较您的标记。换句话说,Tag上的所有字段都必须相等(不仅仅是id)。如果要准确指定应该如何确定相等性,可以使用重载来传入自己的IEqualityComparer。