16

DropDownListMVC 4 に an からaを設定しenumています。enum 値を最大から最小に並べ替えたいと考えています。ただし、これに直接アプローチする方法はないようです。現在、このコードを使用して、キーが ID で値が表示テキストのディクショナリに追加しています。

var priorities = Enum.GetValues(typeof(Models.Priority)).OfType<Models.Priority>().ToList();

for (int i = priorities.Count - 1; i >= 0; i--)
{
    Models.Priority priority = priorities[i];
    prioritiesDictionary.Add((int)priority, "Priority " + ((int)priority).ToString());
}

列挙値をリストに入れて逆方向にループすることが最も効率的な方法だとは思いません。列挙型には 4 つの値しかありませんが、OrderByから返されたものに対して操作を実行するためのより良い方法はありEnum.GetValuesますか? 私のやり方でパフォーマンスへの影響が最小限になることはわかっていますが、より大きな列挙型について知りたいです。

4

4 に答える 4

28

あなたが望むように聞こえます:

var priorities = ((Models.Priority[]) Enum.GetValues(typeof(Models.Priority)))
                                          .OrderByDescending(x => x);

または、多くの括弧を避けるには:

var priorities = (Models.Priority[]) Enum.GetValues(typeof(Models.Priority));
var ordered = priorities.OrderByDescending(x => x);

辞書を提供することによって、現在のコードがどのように役立つかは明確ではありませんが、上記は間違いなく、最高から最低の順に列挙された一連の列挙値を提供します。にキャストする必要はありませんint。同じ型の列挙値は既に互いに比較可能であるためです。

リストが必要な場合は、電話ToList()の後にOrderByDescending電話してください。

于 2013-10-25T20:54:26.357 に答える
15

これはどうですか:

Enum.GetValues(typeof(Models.Priority))
    .Cast<Models.Priority>()
    .OrderByDescending(x => (int) x)
    .ToList();

このスタイルのロジックでは使用OfType<T>()しないでください。これは、一致しないアイテムを黙って破棄するためです。この場合、一致しないアイテムは重大なエラーまたは誤用を示します。

すべてのアイテムがすでに特定のタイプであると予想される場合は、 を使用しますCast<T>()

OfType<T>フィルター操作であり、一部のアイテムを期待される型にキャストできないことがわかっているシナリオでの使用を目的としています。OfType<T>したがって、null価値のあるアイテムを含む可能性のあるリストで役立ちます。

OfType<T>Type Attributeのような型なしまたはobject列挙を操作する式で、または列挙が基本型であり、特定の実装のオブジェクトのみが必要な場合、または特定のインターフェイスを実装する場合によく使用されます。

于 2013-10-25T20:54:31.913 に答える
4

上記に基づいて、再利用可能な関数を作成します...

    public static IOrderedEnumerable<TEnum> Sort<TEnum>()
    {
        return ((TEnum[]) Enum.GetValues(typeof (TEnum))).OrderBy(x => x.ToString());
    }
于 2015-11-20T20:09:10.950 に答える