首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速性能- LINQ可以获取一个列表中的项目,而不是另一个列表中的项目

加速性能- LINQ可以获取一个列表中的项目,而不是另一个列表中的项目
EN

Stack Overflow用户
提问于 2019-04-04 04:46:32
回答 3查看 130关注 0票数 1

我有两个列表,并且我试图返回不在另一个列表中的项目。下面是我的代码:

代码语言:javascript
复制
var Results = ListOne.Where(x => ListTwo.All(a => a.EmployeeNum != x.EmployeeNum && a.Sched != x.Sched));

这大约需要9-10秒才能完成。ListOne大约有1,200条记录,ListTwo大约有33000条记录。

EN

回答 3

Stack Overflow用户

发布于 2019-04-04 04:59:15

使用HashSet<T>,因为它有O(1)搜索时间,可以提高性能,例如

代码语言:javascript
复制
var hashSet = new HashSet<T>(ListTwo.Select(x => Tuple.Create(x.EmployeeNum, x.Sched)));
var results = ListOne.Where(x => !hashSet.Contains(Tuple.Create(x.EmployeeNum, x.Sched)));
票数 4
EN

Stack Overflow用户

发布于 2019-04-04 05:23:26

您还可以创建自己的IEqualityComparer (假设您有一个名为Employee的类):

代码语言:javascript
复制
var results = ListTwo.Except(ListOne, new EmployeeComparer());

IEqualityComparer实现:

代码语言:javascript
复制
public class EmployeeComparer : IEqualityComparer<Employee>
{
    public int GetHashCode(Employee co)
    {
        if (co == null)
        {
            return 0;
        }

        return co.EmployeeNum.GetHashCode();
    }

    public bool Equals(Employee x1, Employee x2)
    {
        if (object.ReferenceEquals(x1, x2))
        {
            return true;
        }

        if (object.ReferenceEquals(x1, null) || object.ReferenceEquals(x2, null))
        {
            return false;
        }

        return x1.EmployeeNum == x2.EmployeeNum && x1.Sched == x2.Sched;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-04-04 05:01:22

尝尝这个

代码语言:javascript
复制
var Results = ListOne.AsParallel().Where(x => ListTwo.All(a => a.EmployeeNum != x.EmployeeNum && a.Sched != x.Sched)).ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55504000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档