使用C#在List<>中查找项

66

我有一个包含对象集合的列表。

如何在这个列表中搜索一个属性为myValue的对象?

6个回答

164
你有几个选择:
使用 Enumerable.WhereEnumerable.FirstOrDefault: list.Where(i => i.Property == value).FirstOrDefault(); // C# 3.0+
仅使用 Enumerable.FirstOrDefault: list.FirstOrDefault(i => i.Property == value); // C# 3.0+
使用 List.Find: list.Find(i => i.Property == value); // C# 3.0+ list.Find(delegate(Item i) { return i.Property == value; }); // C# 2.0+

所有这些选项都会返回default(T)(对于引用类型则为null),如果没有找到匹配项。

如下面的评论所述,您应该针对您的场景使用适当的比较形式:

  • == 用于简单值类型或希望使用运算符重载的情况
  • object.Equals(a, b) 用于大多数类型未知或比较已被覆盖的情况
  • string.Equals(a, b, StringComparison) 用于比较字符串
  • object.ReferenceEquals(a, b) 用于标识比较,通常是最快的

忘了提一下,我正在使用 .net v2。 - JL.
1
@Peter -- 哈哈,不错。现在还很早,我的大脑编译器正在休息 :) - Drew Noakes
除非你知道你正在比较的特定类型支持 ==,否则你应该使用 Equals 进行比较。== 通常会比较引用标识,这很可能不具有所需的语义。 - Joren
通常情况下,当我不知道类型时(大多数情况下你在查找列表时是知道类型的),我会使用object.Equals(a,b),因为它考虑了特定于类型的比较并且能够很好地处理空值。但是对于字符串比较,这个规则有例外,程序员应该通过string.Equals(a,b,StringComparison)指示它是基于顺序还是基于区域敏感的比较。 - Drew Noakes
我并不是指那些你实际上不知道类型的情况(确实,在这种情况下 object.Equals 是一个好选择)。我的意图更多的是说,默认情况下应该使用 Equals,只有当你确定 == 是正确的(例如,不可变类型重载它,或者引用类型没有重载它但你想要引用相等性)时,才应该考虑使用它。 - Joren
2
@Joren - 同意。我认为我们都在同一页面上 :) - Drew Noakes

27

List.Find有什么问题吗?

在我们能够提供真正有帮助的答案之前,我认为我们需要更多了解您所做的事情以及为什么它失败的信息。


5
如果您使用的是.NET 3.0或更高版本,应优先选择LINQ方式,因为LINQ适用于任何IEnumerable和IEnumerable<T>。Find-Method仅适用于List<T>,一旦您需要处理不同的集合,它就无法帮助您。 - Oliver Hanappi
4
简短回答,没有代码示例... 下面的回答更好。 - Pedro77
1
我知道我来晚了,但这个答案对于寻找信息的人来说非常无用。它没有解释List.Find可以做什么以及如何使用它。相比之下,Drew Noakes的解释更深入,详细说明了如何使用它,这实际上给出了一个正确的答案:“如何在列表中查找项目”。这个答案只是一个函数链接,没有任何解释为什么应该使用链接中的函数。 - Mandemon

8
var myItem = myList.Find(item => item.property == "something");

2
item = objects.Find(obj => obj.property==myValue);

1
list.FirstOrDefault(i => i.property == someValue); 

这是基于Drew的回答,但更为简洁的版本。

0

对于 .NET 2.0:

list.Find(delegate(Item i) { return i.Property == someValue; });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接