如何提高比较两个列表的LINQ查询的性能?

时间:2017-12-13 12:15:07

标签: c# performance linq

下面的查询可以满足我的需求,但是当两个列表包含多个项目(> 30万)时,它会非常慢。

基本上,它会返回列表2中没有列表1中的文档的所有人。

        personList1.Add(person1);
        personList1.Add(person2);

        personList2.Add(person2);
        personList2.Add(person3);

        var result = personList2
                    .Where(p2 => p2.documents
                        .Exists(d2 => !personList1
                            .Exists(p1 => p1.documents
                                .Contains(d2)
                            )
                        )
                    ).ToList();

        result.ForEach(r => Console.WriteLine(r.name));
        //Should return person3 name

public class Person
{
    public string name { get; set; }
    public List<IdentificationDocument> documents { get; set; }

    public Person()
    {
        documents = new List<IdentificationDocument>();
    }
}

public class IdentificationDocument
{
    public string number { get; set; }
}

完整代码

https://dotnetfiddle.net/gS57gV

任何人都知道如何提高查询性能?谢谢!

1 个答案:

答案 0 :(得分:2)

将所有相关数据放入首先进行查找的结构中:

var lookup = new HashSet<string>(personList1.SelectMany(p => p.documents).Select(d => d.number));

var result = personList1.Where(p => !p.documents.Select(d => d.number).Any(lookup.Contains));