4

我想比较我目前正在使用嵌套“for”循环的 C# 中的两个集合。在 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 中的“代码”与 OrgCollection 中的“AcademicYearCode”属性进行比较,如果相同,则将其添加到下拉列表“ddlYear”中。

提前致谢。

4

4 回答 4

14

您可以在 LINQ 中执行此操作,它提供了更短的代码。要知道它是否更有效,您必须对其进行分析。我认为 linq 的连接运算符在内部使用某种哈希桶,这应该可以提供更好的性能,尤其是在集合很大的情况下。您当前的解决方案是 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 }
于 2012-07-05T12:46:34.230 回答
0
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;
            }

    }
}

这可能是一个选项,但我认为扩展方法“任何”通过迭代以相同的方式工作。

于 2012-07-05T12:49:47.273 回答
0

此解决方案与您的原始解决方案具有相似的速度和效率,但可以通过更改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);
于 2012-07-05T23:16:53.883 回答
0

这个怎么样

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); 
}

在此处使用 aDictionary可提供卓越的性能,并且匹配的 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)); 
}
于 2012-07-05T13:03:46.773 回答