31

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

有没有更清洁的方法来做到这一点?

4

6 回答 6

91

要么使用 LINQ:

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

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

或使用Find代替FindIndex

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

不过,我强烈建议使用 LINQ——如今这是一种更加惯用的方法。

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

于 2013-04-23T19:06:06.833 回答
13

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

MyList.Where(i=>i.name == yourName).Select(j=>j.value);
于 2013-04-23T19:05:25.417 回答
5

我将.Equals()用于比较而不是==.

像这样:

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

特别是因为它为您提供了像 StringComparison 这样的选项,这太棒了。例子:

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

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

于 2015-03-12T12:04:28.220 回答
5

使用函数 Find 是更清洁的方式。

MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
 ....
}
于 2013-04-23T19:26:33.600 回答
3

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

MyList.First(item => string.Equals("foo", item.name)).value
于 2013-04-23T19:06:32.690 回答
-2

嗨,身体很晚,但我正在写

如果(mylist.contains(值)){}

于 2020-04-04T14:39:47.943 回答