6

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;
        }
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するのが最も簡単です。選択の呼び出しも必要ありません:IEnumerableListToList

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

OrderByList<T>または他のをソートしませんIEnumerable<T>。新しい、ソートされたを生成しIEnumerable<T>ます。したがって、呼び出しddlOptions.OrderBy(...)は変更されませんddlOptions

List<T>があり、それをソートしたい場合は、メソッドを使用できます。特に、をパラメーターとしてSort受け取るオーバーロードを使用できます。Comparison<T>これは、新しいを返す代わりに、実際にリストをソートしますIEnumerable

Comparison<T>Tは、2つを取り、最初の数値が2番目の数値より「小さい」場合は負の数、最初の数値が2番目の数値より「大きい」場合は正の数、前にソートされていない場合はゼロを返す関数を表すデリゲートです。次々と。

この場合、それを覚えておく必要はありません。代わりに、これを行うことができます:

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

DisplayTextリスト内の2つの項目を受け取り、それらのプロパティの比較結果(負、0、または正)を返す関数を渡します。

元のリストを変更しないOrderBy ために使用することがあります。ただし、リストの変更が必要な場合、を使用できますSort

于 2019-07-16T17:07:46.243 に答える