C#匹配不同列表中的项目

时间:2013-12-17 19:37:17

标签: c# algorithm matching

我有两个不同的对象列表,其中一个是IQueryable集(卷入一个数组),另一个是List集。两组中的对象共享一个名为ID的字段;第二组中的每个对象将匹配第一组中的对象,但不一定反之亦然。我需要能够处理两个组(匹配和不匹配)。在这种情况下,两个集合的大小在300到350个对象之间(作为参考,为第二组中的对象生成的XML通常不超过7k,因此可以考虑实际内存的大小的一半到三分之二)每组中每个对象使用的。)

我当前设置的方式是for循环,它迭代IQueryable集的数组表示,使用LINQ语句查询匹配记录的List集。这需要太多时间;我正在运行带有10GB RAM的Core 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

2 个答案:

答案 0 :(得分:2)

您应该使用Enumerable.JoinEnumerable.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
}

答案 1 :(得分:1)

您的问题是样本代码/信息缺乏,但我个人希望使用类似的方法;加入,相交或包含。如有必要,请使用“选择”对要匹配的字段进行投影,或者定义自定义IEqualityComparer