从列表中选择单个项目
使用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(); }