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

RaG*_*aGe 23 .net c# linq list

我有一个List<MyClass> MyList地方

public class MyClass
{
    public string name { get; set; }
    public string value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

给定一个名字,我想获得相应的价值.我目前实现的目的是:

MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?

Jon*_*eet 79

使用LINQ:

var value = MyList.First(item => item.name == "foo").value;
Run Code Online (Sandbox Code Playgroud)

(当然,这只会找到第一场比赛.围绕这个有很多选择.)

或者使用Find而不是FindIndex:

var value = MyList.Find(item => item.name == "foo").value;
Run Code Online (Sandbox Code Playgroud)

我强烈建议使用LINQ - 这是现在更惯用的方法.

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

  • 在调用`.value`之前不要忘记检查空值 (3认同)
  • @banging:我试图编写一些与原始代码具有相同假设的东西 - 如果找不到值,原始代码就会爆炸,所以这也是如此. (2认同)
  • @RaGe:我更多的是谈论这些属性.但是如果`MyList`不是属性或常量,它可能应该是`myList`,是的.并不是说我一直热衷于'my`作为名字的前缀. (2认同)

Hos*_*Rad 13

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

MyList.Where(i=>i.name == yourName).Select(j=>j.value);
Run Code Online (Sandbox Code Playgroud)


mis*_*sak 5

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

MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
 ....
}
Run Code Online (Sandbox Code Playgroud)


ras*_*s91 5

我将使用.Equals()而不是进行比较==

像这样:

MyClass item = MyList.Find(item => item.name.Equals("foo"));
Run Code Online (Sandbox Code Playgroud)

特别是因为它为您提供了诸如StringComparison之类的选项,非常棒。例:

MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

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