更快?你在那裏有O(n^2)。第一個列表中的每個項目將完全迭代第二個列表中的項目。您需要刪除該連接中的冗餘迭代。一種方法是使用另一個結構來執行O(1)查找匹配。
下面是一些未經測試(未選中),代碼:
var dictionaryA = dataA
.GroupBy(item => new {a = item.a, b = item.b})
.ToDictionary(g => g.Key, g => g.ToList());
var dictionaryB = dataB
.GroupBy(item => new {a = item.a, b = item.b})
.ToDictionary(g => g.Key, g => g.ToList());
var results = dictionaryA
.Where(g1 => dictionaryB.ContainsKey(g1.Key))
.Select(g1 => new {g1 = g1, g2 = dictionaryB[g1.Key]})
.SelectMany(pair =>
pair.g1.SelectMany(item1 =>
pair.g2
.Where(item2 => item2.c != item1.c)
.Select(item2 => new {item1, item2})
)
);
下面是一個簡化版本,如果A,B對是在每個列表中是唯一的。
var dictionaryA = dataA
.ToDictionary(item => new {a = item.a, b = item.b}, item => item);
var dictionaryB = dataB
.ToDictionary(item => new {a = item.a, b = item.b}, item => item);
var results = dictionaryA
.Where(e1 => dictionaryB.ContainsKey(e1.Key))
.Select(e1 => new {i1 = e1.Value, i2 = dictionaryB[e1.Key]})
.Where(pair => pair.i1.c != pair.i2.c);
這是一個驅動器,但爲什麼不.Intersect()的工作? http://msdn.microsoft.com/en-us/library/system.linq.queryable.intersect.aspx – Portman 2009-03-03 14:41:27
相交不返回對 – 2009-03-03 15:01:34