假设我的C#程序中有一个如下定义的类:
class MyClass
{
public string ID;
public int Val;
public DateTime StartDate;
public DateTime EndDate;
}
我的程序中有一个巨大的List<MyClass>
,我需要检查此列表中是否有值:
Val != 0
,但标准要比标准复杂得多)ID
匹配)StartDate
等于此当前值&#39; s 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
变量,但这并没有帮助提高效率,所以我只是这样编写它来制作我的问题更容易理解)
答案 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());