2013-04-23 112 views
20

我有一个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 

有没有更干净的方式来做到这一点?

+1

可能重复* [如何在列表中找到特定元素?](http://stackoverflow.com/questions/9854917/how-can-i-find-a-specific-element-in- A-listt)*。 – 2016-10-19 16:57:52

回答

68

要么使用LINQ:

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

(这将只是找到了第一场比赛,当然有很多解决此选项。)

或者使用Find代替FindIndex

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

我强烈建议使用LINQ,虽然 - 这是一个更多的idiomat ic这些天。

(我也建议遵循.NET的命名规则。)

+3

不要忘记在调用'.value'之前检查空值 – banging 2013-04-23 19:08:58

+2

@banging:我正在尝试编写与原始代码具有相同假设的东西 - 如果未找到该值,原始代码将会爆炸,所以这也是。 Ty。 – 2013-04-23 19:13:41

+0

Ty。当你说.net命名约定时,你的意思是没有大写对象名称的首字母吗? (** M ** yList vs myList)还是别的? – RaGe 2013-04-23 19:14:59

11

您可以使用Where进行过滤,并使用Select来获得所需的值。

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

我刚刚刷新了,Skeet的回答是“4分钟前”,而Hosseins说“3分钟前”......现在他们都是4岁。我将它称为一条领带(他们都不知道对方正在回答) – Cemafor 2013-04-23 19:11:33

+0

以及对此答案的所有评论正在消失 – Cemafor 2013-04-23 19:12:22

+0

@Cemafor:我看到侯赛因在回答,但我给出了一个稍微不同的答案 - 因为它只找到*一个*值。 (这就是所有这些都被视为一项要求。) – 2013-04-23 19:14:17

3

Enumerable.First返回,而不是指数的元素。在这两种情况下,如果列表中没有出现匹配的元素,您将得到一个异常(当您尝试在索引-1处获取项目时,您的原始代码将抛出IndexOutOfBoundsException,但First将抛出InvalidOperationException)。

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

使用函数查找更干净的方式。

MyClass item = MyList.Find(item => item.name == "foo"); 
if (item != null) // check item isn't null 
{ 
.... 
} 
2

我会用.Equals()进行比较,而不是==

像这样:

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

特别是因为它可以让你喜欢StringComparison,这是真棒选项。例如:

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

这使您的代码可以忽略特殊字符,大写和小写。有更多的选择。