LINQはIEnumerableで動作しますか?


87

を実装するクラスがありますがIEnumerable、を実装していませんIEnumerable<T>。このクラスを変更することはできません。また、代わりに別のクラスを使用することもできません。私がMSDNから理解したように、クラスがを実装する場合、LINQを使用できますIEnumerable<T>。を使用してみましたinstance.ToQueryable()が、それでもLINQメソッドが有効になりません。このクラスには1つのタイプのインスタンスしか含めることができないため、クラスは実装できますがIEnumerable<T>、実装できません。では、LINQ式を使用してこのクラスをクエリするにはどうすればよいですか?


IEnumerableをキャストしないと、すべてのlinqメソッドの代わりに、AsQueryable、Cast <>、Equals、GetEnumerator、GetHashCode、GetType、OfType <>、ToString
ShawnFeatherly 2013年

回答:


134

Cast<T>()またはOfType<T>を使用して、LINQを完全にサポートするIEnumerableの汎用バージョンを取得できます。

例えば。

IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();

または、含まれているタイプがわからない場合は、いつでも実行できます。

IEnumerable<object> e = objects.Cast<object>();

非ジェネリックIEnumerableにさまざまなタイプのオブジェクトが含まれていて、たとえばにのみ関心がある場合。あなたができる文字列:

IEnumerable<string> strings = objects.OfType<string>();

2
毎日、LINQについて何か新しいことを学びます。毎日、私はそれをますます愛しています。
ジョアン・メンデス

11

はい、できます。Cast<T>関数を使用して、型付きに変換する必要がありますIEnumerable<T>。例えば:

IEnumerable e = ...;
IEnumerable<object> e2 = e.Cast<object>();

現在e2はでIEnumerable<T>あり、すべてのLINQ関数で動作できます。


3

LINQのクエリ内包構文を使用することもできます。これitemは、型が指定されている場合、範囲変数の型(この例では)にキャストします。

IEnumerable list = new ArrayList { "dog", "cat" };

IEnumerable<string> result =
  from string item in list
  select item;

foreach (string s in result)
{
    // InvalidCastException at runtime if element is not a string

    Console.WriteLine(s);
}

効果は@JaredParのソリューションと同じです。詳細については、7.16.2.2: C#言語仕様の明示的な範囲変数タイプを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.