从列表中选择单个项目

时间:2009-04-09 17:50:59

标签: c# linq

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

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

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

8 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分: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);

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

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

希望这会有所帮助: - )

答案 2 :(得分:11)

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

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时抛出异常)

DataContext dc = new DataContext();

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

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

使用FirstOrDefault()来涵盖您可以拥有多个的情况。

答案 5 :(得分:2)

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

您可以使用First<T>()FirstOrDefault<T>()扩展程序获取第一个结果或default(T)

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

答案 6 :(得分:0)

您需要

SingleOrDefault()

欢呼声

答案 7 :(得分:0)

现在看到这个,如果您正在使用对象列表,可以试试这个

 public class user
{
    public string username { get; set; }
    public string password { get; set; }
}

  List<user> userlist = new List<user>();

        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();

            }