我有两个不同的对象列表,一个是 IQueryable 集(汇总到一个数组中),另一个是 List 集。两个集合中的对象共享一个名为 ID 的字段;第二组中的每个对象都将与第一组中的对象匹配,但反之则不一定。我需要能够处理这两个组(匹配和不匹配)。在这种情况下,两个集合的大小都在 300 到 350 个对象之间(作为引用,为第二组中的对象生成的 XML 通常不超过 7k,因此考虑实际内存可能是该大小的一半到三分之二由每个集合中的每个对象使用)。
我目前设置它的方式是循环遍历 IQueryable 集的数组表示,使用 LINQ 语句查询列表集以查找匹配记录。这需要太多时间;我正在运行具有 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
最佳答案
您应该使用类似 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
}
关于C# 匹配不同列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20643155/