从列表中选择单个项目

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

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

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

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

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

使用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); 

只需将谓词传递给First或FirstOrDefault方法 ,它就会愉快地绕过列表并为您选择第一个匹配项。

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

希望这可以帮助 :-)

 List items = new List(); items.Find(p => p == "blah"); 

要么

 items.Find(p => p.Contains("b")); 

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

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

寻找帐户的例子……

 DataContext dc = new DataContext(); Account item = dc.Accounts.FirstOrDefault(p => p.id == 5); 

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

 DataContext dc = new DataContext(); Account item = dc.Accounts.SingleOrDefault(p => p.id == 5); 

只是为了完成答案,如果你使用的是LINQ语法,你可以将它包装起来,因为它返回一个IEnumerable:

 (from int x in intList where x > 5 select x * 2).FirstOrDefault() 

有两种简单的方法,具体取决于您是要处理exception还是获取默认值。

您可以使用First()FirstOrDefault()扩展方法来获取第一个结果或default(T)

 var list = new List { 1, 2, 4 }; var result = list.Where(i => i == 3).First(); // throws InvalidOperationException var result = list.Where(i => i == 3).FirstOrDefault(); // = 0 

也许我在这里遗漏了一些东西,但通常调用.SingleOrDefault()是返回列表中单个元素的方法,或者默认值(null为引用或可空类型)是列表为空。 如果列表包含多个元素,则会生成exception。

使用FirstOrDefault()来处理可能有多个的情况

SingleOrDefault()就是您所需要的

干杯

刚刚看到这个,如果你正在处理一个对象列表,你可以尝试这个

  public class user { public string username { get; set; } public string password { get; set; } } List userlist = new List(); userlist.Add(new user { username = "macbruno", password = "1234" }); userlist.Add(new user { username = "james", password = "5678" }); string myusername = "james"; string mypassword = "23432"; user theUser = userlist.Find( delegate (user thisuser) { return thisuser.username== myusername && thisuser.password == mypassword; } ); if (theUser != null) { Dosomething(); } else { DoSomethingElse(); }