c# - Linq - 在列表 <> 中查找缺失值 - 效率极低

标签 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等于当前值的 EndDate

我目前的代码如下:

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 变量,但这对效率没有帮助,所以我只是这样写它以使我的问题更容易理解)

最佳答案

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

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

关于c# - Linq - 在列表 <> 中查找缺失值 - 效率极低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846578/

相关文章:

c# - 在 C# 中使用百分比

c# - 在 C# 中使用 FTP 移动文件

c# - 为什么 catch 语句不捕获所有异常?

c# - 如何使用 LINQ 将两个或多个集合合并为一个集合

c# - 如何按 IEnumerable 属性中的值分组

c# - 使用 Entity Framework、LINQ 进行预加载

c# - 如何取消 tailable 游标上的 MoveNext 操作

c# - Dynamics CRM - 在新创建实体的工作流中访问属性

c# - 使用 Razor 模板生成 .aspx 页面

c# - LINQ DateTimeOffset 与今天的比较