繁体   English   中英

Linq OrderBy 不对列表进行排序<t> . 如何对列表进行排序?</t>

[英]Linq OrderBy does not sort a List<T>. How do I sort the list?

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

OrderBy 返回一个执行排序的查询:它不会修改原始列表(而像List<T>.Sort这样的东西会修改原始列表)

而是试着像:

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

编辑:您可能想要使用ddlOptions的类型或者返回数据的位置/方式,因为我们正在做一个额外的ToList不是必要的,但这对于这种情况来说可能是一个小问题/非问题。

尝试:

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

正如其他人所说,你需要将OrderBy的结果分配给某个东西,因为它不会改变它所作用的序列。 最简单的方法是使ddlOptions成为IEnumerable而不是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;
}

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

你需要输入:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM