Linq - 查找列表中的缺失值<> - 非常低效

时间:2016-04-25 16:54:04

标签: c# linq

假设我的C#程序中有一个如下定义的类:

class MyClass
{
    public string ID;
    public int Val;
    public DateTime StartDate;
    public DateTime EndDate;
}

我的程序中有一个巨大的List<MyClass>,我需要检查此列表中是否有值:

  1. 满足一系列标准(在此简化示例中,假设Val != 0,但标准要比标准复杂得多)
  2. 列表中的相应值(ID匹配)StartDate等于此当前值&#39; s EndDate
  3. 我目前的代码如下:

    var myTest = new List<MyClass>();
    
    ... populate myTest ...
    
    var expectDt1 = myTest
                      .Where(v => v.Val != 0)
                      .Select(v => new {ID = v.ID, EndDate = v.EndDate});
    
    var dontExist = expectDt1
                      .Where(tst => 
                             !myTest.Any(v => 
                                 v.ID.Equals(tst.ID) 
                                 && v.StartDate == tst.EndDate
                                 )
                              );
    

    此代码有效,但运行速度非常慢(我的列表中有数千个条目)。是否有更好的方法(分组或其他)可以提高效率?

    (PS - 我知道我可以将它变成一个更简化的Linq语句而不需要中间expectedDt1变量,但这并没有帮助提高效率,所以我只是这样编写它来制作我的问题更容易理解)

1 个答案:

答案 0 :(得分:6)

您希望创建一个基于散列的查找结构来查找具有给定值的项目,而不是通过大型列表对每个项目进行线性搜索。

var lookup = myTest.Where(ItemIsValid)
    .ToLookup(item => new
    {
       item.ID,
       Date = item.EndDate,
    });

然后,您可以浏览其他收藏集,看看您是否可以在查找中找到匹配项:

var query = expectDt1.Where(item => !lookup[new {item.ID, Date = item.StartDate}].Any());