Linq OrderBy不在If语句中工作

时间:2013-01-18 16:42:10

标签: c# asp.net-mvc linq

OrderBy子句的问题对排序没有任何影响。我已经在调试器中完成了这个工作,并确保这是一个案例,即代码的排序行被命中,并且在订单之后查看结果尚未应用。

public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>(
            IEnumerable<TClass> list, 
            Func<TClass, TValueType> value, 
            Func<TClass, string> displayText,
            bool sort = true
        )
        {
            List<DDLOptions<TValueType>> ddlOptions;

            ddlOptions = list.Select(
                l => new DDLOptions<TValueType>
                        {
                            Value = value(l),
                            DisplayText = displayText(l)
                        }
                    ).ToList();  <========== Works if I put the Order By here.

            if (sort)
            {
                ddlOptions.OrderBy(l => l.DisplayText); <===== Does NOT work here.
            }

            return ddlOptions;
        }

5 个答案:

答案 0 :(得分:9)

OrderBy 返回将执行排序的查询:它不会修改原始列表(而List<T>.Sort之类的内容会修改原始列表

而是尝试类似:

ddlOptions = ddlOptions.OrderBy(l => l.DisplayText).ToList();

编辑:您可能想要使用ddlOptions的类型或者返回数据的位置/方式,因为我们正在做一个额外的ToList而不是必要的,但这可能是次要/无论如何,这个案子都没有问题。

答案 1 :(得分:6)

尝试:

if (sort)
{
    ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); <===== Should work now.
}

答案 2 :(得分:3)

正如其他人所说,你需要将OrderBy的结果分配给某个东西,因为它不会改变它所作用的序列。最简单的方法是ddlOptionsIEnumerable而不是List,以便您可以将结果分配给该ToList。也不需要选择public static IEnumerable<DDLOptions<TValueType>> GetDDLOptionsViewModel<TClass, TValueType>( IEnumerable<TClass> list, Func<TClass, TValueType> value, Func<TClass, string> displayText, bool sort = true ) { IEnumerable<DDLOptions<TValueType>> ddlOptions; ddlOptions = list.Select( l => new DDLOptions<TValueType> { Value = value(l), DisplayText = displayText(l) } ); if (sort) { ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); } return ddlOptions; } 调用:

ToList

请注意,此版本的方法将使用延迟执行,因此在迭代序列之前不会实际执行Select / OrderBy。如果您不想这样做,可以在return行添加{{1}}。

答案 3 :(得分:1)

您需要输入:

ddlOptions = ddlOptions.OrderBy(l => l.DisplayText);

答案 4 :(得分:0)

OrderBy不对List<T>或任何其他IEnumerable<T>进行排序。它产生一个新的,已排序的IEnumerable<T>。因此,调用ddlOptions.OrderBy(...)不会修改ddlOptions

如果您有一个List<T>并希望对其进行排序,则可以使用Sort方法-特别是将Comparison<T>作为参数的重载。这实际上是对列表进行排序,而不是返回新的IEnumerable

Comparison<T>是代表一个函数的委托,该函数采用T中的两个,如果第一个“小于”第二个,则返回负数;如果第一个“大于”第二个,则返回正数。第二个,如果一个没有在另一个之前或之后排序,则为零。

在这种情况下,您不必记住这一点。相反,您可以执行以下操作:

ddlOptions.Sort((x, y) => string.CompareOrdinal(x.DisplayText, y.DisplayText));

您要传入一个函数,该函数接受列表中的两个项目并返回其DisplayText属性的比较结果,这些属性的结果将为负,0或正。

有时我们使用OrderBy 因为不会修改原始列表。但是,如果要修改列表 是我们想要的,则可以使用Sort