gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:08:05 26 4
gpt4 key购买 nike

假设我在我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com