web-dev-qa-db-ja.com

配列をIEnumerable <T>に変換する

驚いたことに、次のステートメントが表示されます。

public static IEnumerable<SomeType> AllEnums 
  => Enum.GetValues(typeof(SomeType));

System.ArrayからSystem.Collection.Generic.IEnumerableに変換できないことについて文句を言う。後者は前者から受け継いだものだと思いました。どうやら私は間違っていた。

LINQまたは。ToListができないため、適切に処理する方法がわかりません。明示的なキャストは避けたいと思います。これはenumの値の集まりなので、SomeTypeとして-ingはあまり役に立たないと思います。 。

13

一般的なArray基本クラスは型指定されていないため、型固有のインターフェースは実装されていません。ただし、vectorは直接キャストできます-そしてGetValuesは実際にはベクトルを返します。そう:

public static IEnumerable<SomeType> AllEnums
    = (SomeType[])Enum.GetValues(typeof(SomeType));

またはおそらくもっと簡単です:

public static SomeType[] AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType));
18
Marc Gravell

後者は前者から受け継いだものだと思いました。

_Enum.GetValues_はArrayを返します。これは、非ジェネリックIEnumerableを実装するため、キャストを追加する必要があります。

_public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType))
    .Cast<SomeType>()
    .ToList(); 
_

_Cast<T>_だけでなく、非ジェネリックIEnumerableインターフェイスに対して_IEnumerable<U>_拡張メソッドが定義されているため、これはLINQで機能します。

編集:ToList()の呼び出しは、実行が延期されたLINQメソッドによって生成された_IEnumerable<T>_の複数回の歩行に関連する非効率性を回避します。素晴らしいコメントをありがとう、マーク!

4
dasblinkenlight