6

OrderBy 子句的问题对排序没有任何影响。我已经在调试器中完成了这个过程,并确保这是一个代码的排序行被命中的情况,并在未应用 order by 之后查看结果。

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

5 回答 5

12

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

而是尝试类似:

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

编辑:您可能想尝试返回数据的类型ddlOptions或返回数据的位置/方式,因为我们正在做的事情ToList可能超出了必要的范围,但这对于这种情况来说可能是次要/非问题。

于 2013-01-18T16:43:28.627 回答
6

尝试:

if (sort)
{
    ddlOptions = ddlOptions.OrderBy(l => l.DisplayText); <===== Should work now.
}
于 2013-01-18T16:43:13.563 回答
3

正如其他人所说,您需要将结果分配OrderBy给某事,因为它不会改变它所作用的序列。ddlOptions制作aIEnumerable而不是 a是最简单的List,这样您就可以将结果分配给它。ToList也不需要对 select的调用:

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

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

于 2013-01-18T16:58:57.683 回答
1

您需要输入:

ddlOptions = ddlOptions.OrderBy(l => l.DisplayText);
于 2013-01-18T16:43:22.893 回答
1

OrderBy不排序 aList<T>或任何其他IEnumerable<T>. 它产生一个新的、排序的IEnumerable<T>. 所以调用ddlOptions.OrderBy(...)不会修改ddlOptions.

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

Comparison<T>是一个代表一个函数的委托,它接受两个,T如果第一个比第二个“小”则返回负数,如果第一个比第二个“大”则返回正数,如果之前没有排序则返回零或在另一个之后。

在这种情况下,您不必记住这一点。相反,您可以这样做:

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

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

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

于 2019-07-16T17:07:46.243 回答