我有两个不同的对象列表,其中一个是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
答案 0 :(得分:2)
您应该使用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
}
答案 1 :(得分:1)
您的问题是样本代码/信息缺乏,但我个人希望使用类似的方法;加入,相交或包含。如有必要,请使用“选择”对要匹配的字段进行投影,或者定义自定义IEqualityComparer
。