在 List<> 中查找包含某个值的元素

35

我有一个List<MyClass> MyList,其中

public class MyClass
{
    public string name { get; set; }
    public string value { get; set; }
}

给定一个名字,我想获取相应的值。目前我已经实现了以下代码:

MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value

有没有更简洁的方法来做这件事?


2
可能是重复的问题,参考 *如何在List<T>中查找特定元素?*。 - Peter Mortensen
6个回答

103

可以使用LINQ:

var value = MyList.First(item => item.name == "foo").value;

(当然,这只会找到第一个匹配项。这方面有很多选项。)

或者使用Find而不是FindIndex

var value = MyList.Find(item => item.name == "foo").value;

我强烈建议使用LINQ-这是一个更加习惯的方法。

(我还建议遵循.NET命名约定。)


5
在调用“.value”之前,请勿忘记检查空值。 - banging
2
@banging: 我试图编写一个具有与原始代码相同假设的程序 - 如果找不到值,原始代码将崩溃,所以这个程序也会。 - Jon Skeet
2
@RaGe:我更多地是在谈论属性。但如果MyList不是一个属性或常量,那么它应该改为myList。虽然我从来不喜欢在名称前加上my作为前缀。 - Jon Skeet
@JonSkeet 我该如何在 Visual Studio 中使用 LINQ 对我的 List<> 进行操作?只有非 LINQ 方法出现,例如 FindIndex。 - guiomie
1
@guiomie:确保你有一个针对 System.Linq 的 using 指令。 - Jon Skeet
显示剩余2条评论

13

您可以使用Where来过滤和Select来获取所需的值。

MyList.Where(i=>i.name == yourName).Select(j=>j.value);

我刚刚刷新了一下,Skeet的回答显示“4分钟前”,而Hosseins的回答显示“3分钟前”...现在它们都变成了4分钟。我会把它称为平局(他们两个都不知道对方在回答)。 - Cemafor
这个回答下的所有评论都消失了。 - Cemafor
@Cemafor:我看到Hossein在回答,但我给出了一个稍微不同的答案——因为它只找到一个值。(这是唯一被指定为要求的。) - Jon Skeet
@JonSkeet:我不确定你是否看到了评论中关于你和Hossein答案相对时间的讨论。当然,你是正确的,你的答案更像是一个被动的就地切换,而Hossein的答案会返回所有匹配项。 - Cemafor
1
@Cemafor:我没有看到评论,只看到了你的。我只是想解释一下,即使彼此知道对方的回答,也可能会有类似但不同的答案 :) - Jon Skeet
应该把“=”改成“==”吧? - B. Clay Shannon-B. Crow Raven

7

我建议使用.Equals()来进行比较,而不是使用==

代码示例:

MyClass item = MyList.Find(item => item.name.Equals("foo"));

特别是因为它提供了像StringComparison这样的选项,非常棒。例如:

MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);

这将使您的代码忽略特殊字符、大小写等。还有更多选项可供选择。


5
使用 Find 函数是更加简洁的方法。
MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
 ....
}

3

Enumerable.First 返回元素而非索引。在两种情况下,如果列表中没有匹配的元素,则会引发异常(当您尝试获取索引为-1的项时,原始代码将抛出IndexOutOfBoundsException,但是First将抛出InvalidOperationException)。

MyList.First(item => string.Equals("foo", item.name)).value

-2

嗨,大家都很晚了,但我还在写代码。

if(mylist.contains(value)){}


欢迎来到 Stack Overflow!不清楚这如何回答问题。请查看 https://stackoverflow.com/help/how-to-answer。 - stephenwade
1
我只能看到答案。抱歉,我将其删除以免混淆任何人。我只能看到评论,没有看到问题上的任何标签或细节,所以我不得不做出一些假设。我已将其删除。 - DavidG

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