从列表中选择单个项目

Dan*_*iel 21 c# linq

使用LINQ如果列表中可能不存在该项,那么从列表中选择单个项目的最佳方法是什么?

我想出了两个解决方案,我都不喜欢.我使用where子句来选择项目列表(我知道它只会是一个),然后我可以检查计数并在此列表上进行单次调用(如果count为1),另一种选择是使用foreach并且只是拿到物品后休息.

这些似乎都不是一个好方法,有没有更好的方法?

Ree*_*sey 38

你可以使用IEnumerable.First()IEnumerable.FirstOrDefault().

不同之处在于,First()如果没有找到任何元素将抛出(或者如果没有元素匹配条件,则使用条件). FirstOrDefault()将返回default(T)(null如果它是引用类型).


cha*_*rit 16

使用FirstOrDefault选择器.

var list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var firstEven = list.FirstOrDefault(n => n % 2 == 0);

if (firstEven == 0)
    Console.WriteLine("no even number");
else 
    Console.WriteLine("first even number is {0}", firstEven);
Run Code Online (Sandbox Code Playgroud)

只需将谓词传递给FirstFirstOrDefault方法,它就会愉快地绕过列表并为您挑选第一个匹配项.

如果没有匹配项,FirstOrDefault将返回列表项的任何数据类型的默认值.

希望这可以帮助 :-)


byt*_*der 11

List<string> items = new List<string>();

items.Find(p => p == "blah");
Run Code Online (Sandbox Code Playgroud)

要么

items.Find(p => p.Contains("b"));
Run Code Online (Sandbox Code Playgroud)

但这允许您通过匹配谓词定义您要查找的内容...

我想如果你正在谈论linqToSql那么:

寻找帐户的例子......

DataContext dc = new DataContext();

Account item = dc.Accounts.FirstOrDefault(p => p.id == 5);
Run Code Online (Sandbox Code Playgroud)

如果你需要确保只有1项(当超过1时抛出异常)

DataContext dc = new DataContext();

Account item = dc.Accounts.SingleOrDefault(p => p.id == 5);
Run Code Online (Sandbox Code Playgroud)