Linq比较C#中的两个集合

我想比较C#中的两个集合,我目前正在使用嵌套的“for”循环。 Linq有没有办法做同样的事情会更快更有效率? 这是我目前的代码,它只是寻找一种有效的方法:

OrgCollection myYears = Org.RetrieveDistinctYear(); if (myYears.Count > 0) { AcademicYearCollection allYears = AcademicYear.RetrieveAll(); for (int i = 0; i < myYears.Count; i++) { for (int j = 0; j < allYears.Count; j++) { if (myYears[i].AcademicYearCode == allYears[j].Code) { ddlYear.Items.Insert(0, new ListItem(allYears[j].Name,allYears[j].Code)); break; } } } } 

我想将AcademicYearCollection中的“Code”与OrgCollection中的“AcademicYearCode”属性进行比较,如果它是相同的,则将其添加到Dropdownlist“ddlYear”中。

提前致谢。

您可以在LINQ中执行此操作,从而提供更短的代码。 要知道它是否更有效,您必须对其进行分析。 我认为linq的join运算符使用某种类型的散列桶,这应该会提供更好的性能,特别是如果集合很大的话。 您当前的解决方案是O(N ^ 2),如果选项数量增加,它将迅速降级。

 OrgCollection myYears = Org.RetrieveDistinctYear(); AcademicYearCollection allYears = AcademicYear.RetrieveAll(); var items = from y in myYears join ay in allYears on y.Code equals ay.AcademicYearCode select new { ay.Name, ay.Code } 
 OrgCollection myYears = Org.RetrieveDistinctYear(); if (myYears.Count > 0) { AcademicYearCollection allYears = AcademicYear.RetrieveAll(); for (int i = 0; i < myYears.Count; i++) { if (allYears[j].Any(allY => allY == myYears[i].AcademicYearCode )) { ddlYear.Items.Insert(0, new ListItem(allYears[j].Name, allYears[j].Code)); break; } } } 

这可能是一个选项,但我认为扩展方法’any’通过迭代工作方式相同。

这个怎么样

 var allYears = AcademicYear.RetrieveAll().ToDictionary(y => y.Code, y.Name); ListItem match = null; foreach(var year in Org.RetrieveDistinctYear()) { if (allYears.HasKey(year.AcademicYearCode) { match = new ListItem( allYears[year.AcademicYearCode], year.AcademicYearCode); break; } } if (match != null) { ddlYear.Items.Insert(0, match); } 

在这里使用Dictionary提供了卓越的性能,并且在匹配的Org.RetrieveDistinctYear结果的下方,将会带来更多的好处。 如果RetrieveDistinctYear的结果通常很短或匹配位于顶部,则创建字典的开销将使代码失败。


编辑

或者这种方法

 var allYears = AcademicYear.RetrieveAll().ToDictionary(y => y.Code, y.Name); var matchingCode = Org.RetrieveDistinctYear() .Select(y = y.AcademicYearCode) .FirstOrDefault(code => allYears.HasKey(code)); if (!string.IsEmptyOrWhitespace(matchingCode)) { ddlYear.Items.Insert(0, new ListItem( allYears[matchingCode], matchingCode)); } 

此解决方案与原始解决方案具有相似的速度和效率,但可以通过将from y in myYearsfrom y in myYears.AsParallel()更改from y in myYears from y in myYears.AsParallel()来进行并行化,从而可以加快速度。

 OrgCollection myYears = Org.RetrieveDistinctYear(); AcademicYearCollection allYears = AcademicYear.RetrieveAll(); var items = from y in myYears let match = allYears.FirstOrDefault( ay => y.AcademicYearCode == ay.Code) where match != null select new ListItem(match.Name, match.Code);