在不同的列表C#匹配的项目(C# Matching items in different lists

2019-10-19 02:51发布

我有对象的两个不同的列表,其中一个一个IQueryable组(卷成的阵列),而另一列表集。 在这两组对象共享一个称为ID字段; 每个在所述第二组中的对象的将匹配所述第一组中的对象,但并不一定反之亦然。 我需要能够同时处理组(匹配和不匹配)。 两个集合的大小是在这种情况下的对象300和350之间(作为参考,对于在所述第二组中的对象生成的XML,通常不大于7K以上,所以也许一半认为到该尺寸的三分之二的实际存储器通过使用在每个组中的每个对象)。

我有它目前设立的方式是一个for循环迭代是通过IQueryable的集合的数组表示,使用LINQ语句来查询的列表中匹配的记录集。 这需要太多的时间; 我跑的RAM 10GB酷睿i7和它采取的任何地方从10秒到2.5分钟,以匹配和比较的对象。 任务管理器不显示任何巨大的内存使用情况 - 下一个25MB的树荫。 我的系统线程没有被任何征税。

有没有一种方法或算法,可以让我以更快的步伐配对对象中的每个设置一个时间,从而迭代通过对和无与伦比的对象? 这组对象只是8000+这一计划的一小部分将不得不通过每一天,一旦它开始运行咀嚼...

编辑:这是我在实际运行的代码...

        for (int i = 0; i < draftRecords.Count(); i++)
        {
            sRecord record = (from r in sRecords where r.id == draftRecords.ToArray()[i].ID select r).FirstOrDefault();
            if (record != null)
            { // Do stuff with the draftRecords element based on the rest of the content of the sRecord object

Answer 1:

您应该使用的方法,如Enumerable.Join或Enumerable.GroupJoin匹配来自两个集合的项目。 这将远远比做嵌套的for循环快。

既然你想要的键集合匹配,其中可能会或可能不存在第二个列表中的项目GroupJoin可能更合适。 这看起来是这样的:

var results = firstSet.GroupJoin(secondSet, f => f.Id, s => s.Id, (f,sset) => new {First = f, Seconds = sset});

foreach(var match in results)
{
    Console.WriteLine("Item {0} matches:", match.First);
    foreach(var second in item.Seconds)
        Console.WriteLine("   {0}", second); // each second item matching, one at a time
}


Answer 2:

你的问题是缺乏示例代码/资料,但我会亲自看一下使用方法一样; 加入,相交,或包含。 如果需要使用选择你要匹配或定义自定义字段的投影IEqualityComparer



文章来源: C# Matching items in different lists