首页 > 解决方案 > 在循环中执行 LINQ 的 ThenBy 时遇到问题

问题描述

我觉得这里发生了一些愚蠢的语法错误,但我一生都无法弄清楚。我正在尝试使用多个属性对一个大列表进行排序。

方法一:

IOrderedEnumerable<myClass> orderedList = myList.OrderByDescending(e => e.Tier);

orderedList = orderedList.ThenByDescending(e => e.Priority[0].Value);
orderedList = orderedList.ThenByDescending(e => e.Priority[1].Value);
orderedList = orderedList.ThenByDescending(e => e.Priority[2].Value);

orderedList = orderedList.ThenByDescending(e => e.Score);

方法B:

IOrderedEnumerable<myClass> orderedList = myList.OrderByDescending(e => e.Tier);

for (int i = 0; i < 3; i++)
{
    orderedList = orderedList.ThenByDescending(e => e.Priority[i].Value);
}

orderedList = orderedList.ThenByDescending(e => e.Score);

上面的方法 A 完美地工作,但是方法 B(我需要这样做的方式)不断返回索引超出范围错误,即使它应该完全相同(即 0、1、2)

在这两种情况下,e.Priority 都表示 3 个 KeyValuePairs 的列表。我不明白为什么方法 B 返回超出范围的错误。

标签: c#linqlinq-to-entities

解决方案


嘿,这里是循环的经典问题。正确的做法:

IOrderedEnumerable<myClass> orderedList = myList.OrderByDescending(e => e.Tier);

for (int i = 0; i < 3; i++)
{
    int capturedIndex = i;
    orderedList = orderedList.ThenByDescending(e => e.Priority[capturedIndex].Value);
}

orderedList = orderedList.ThenByDescending(e => e.Score);

更多内容:在 C# 中的循环中捕获变量


推荐阅读