我有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
有更简洁的方法吗?
答案 0 :(得分:74)
使用LINQ:
var value = MyList.First(item => item.name == "foo").value;
(当然,这只会找到第一场比赛。围绕这个有很多选择。)
或使用Find
代替FindIndex
:
var value = MyList.Find(item => item.name == "foo").value;
我强烈建议使用LINQ - 这是近来惯用的方法。
(我还建议遵循.NET命名约定。)
答案 1 :(得分:13)
您可以使用Where
过滤和Select
来获得所需的值。
MyList.Where(i=>i.name == yourName).Select(j=>j.value);
答案 2 :(得分:4)
使用功能查找是更清洁的方式。
MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
....
}
答案 3 :(得分:4)
我会使用.Equals()
进行比较而不是==
。
像这样:
MyClass item = MyList.Find(item => item.name.Equals("foo"));
特别是因为它为您提供了像StringComparison这样的选项,这非常棒。例如:
MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);
这使您的代码可以忽略特殊字符,大写和小写。还有更多选择。
答案 4 :(得分:3)
Enumerable.First
返回元素而不是索引。在这两种情况下,如果列表中没有匹配的元素,您将收到异常(当您尝试在索引-1处获取项目时,原始代码将抛出IndexOutOfBoundsException
,但First
将抛出{ {1}})。
InvalidOperationException
答案 5 :(得分:-2)
他的身体很晚了,但我正在写
if(mylist.contains(value)){}