代码之家  ›  专栏  ›  技术社区  ›  Daniel

从列表中选择单个项目

  •  21
  • Daniel  · 技术社区  · 17 年前

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

    我想出了两个解决方案,我都不喜欢。我使用WHERE子句来选择项目列表(我知道只有一个项目),然后我可以检查计数并在此列表上进行单个调用如果COUNT是一个,则另一个选择是使用foreach并在获取项目后中断。

    这两种方法都不是好方法,有更好的方法吗?

    8 回复  |  直到 17 年前
        1
  •  36
  •   A Coder    10 年前

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

    区别在于 First() 如果找不到元素(或者如果没有元素匹配条件,则使用条件),则将引发。 FirstOrDefault() 将返回 default(T) ( null 如果是引用类型)。

        2
  •  16
  •   chakrit Dutchie432    17 年前

    使用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将返回列表项的任何数据类型的默认值。

    希望这有帮助:—)

        3
  •  11
  •   bytebender    17 年前
    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时引发异常)

    DataContext dc = new DataContext();
    
    Account item = dc.Accounts.SingleOrDefault(p => p.id == 5);
    
        4
  •  4
  •   Brian Genisio    17 年前

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

    (from int x in intList
     where x > 5
     select x * 2).FirstOrDefault()
    
        5
  •  2
  •   Samuel    17 年前

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

    你可以使用 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
  •  1
  •   OrionMD    7 年前

    也许我在这里找不到什么东西,但通常是打电话来的 .SingleOrDefault() 是返回列表中单个元素的方法,如果列表为空,则返回默认值(引用为空或可为空的类型为空)。 如果列表包含多个元素,它将生成异常。

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

        7
  •  0
  •   Divyang Desai Jonny B'Good    9 年前

    SingleOrDefault() 是你需要的

    干杯

        8
  •  0
  •   Uchenna Nnodim    9 年前

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

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