using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; public class MyClass { public int Id { get; private set; } public string Name { get; private set; } public MyClass(int id) { this.Id = id; this.Name = id.ToString(); } } class Program { static void Main(string[] args) { var rand = new Random(); var arrayA = Enumerable.Range(1, 10000).Select(_ => new MyClass(rand.Next(1, 100))).ToArray(); var arrayB = Enumerable.Range(1, 10000).Select(_ => new MyClass(rand.Next(1, 100))).ToArray(); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); var sw = Stopwatch.StartNew(); var ret = ( from a in arrayA join b in arrayB on a.Id equals b.Id select a.Name).ToList(); sw.Stop(); Console.WriteLine(sw.Elapsed); GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); sw.Reset(); sw.Start(); var ret2 = new List(); var lookup = arrayB.ToLookup(x => x.Id); foreach (var itemA in arrayA) { foreach (var itemB in lookup[itemA.Id]) { ret2.Add(itemA.Name); } } sw.Stop(); Console.WriteLine(sw.Elapsed); Console.Write("check result : "); Console.WriteLine(ret.SequenceEqual(ret2)); } }