2011-01-31 6 views
2

入力したIEnumerable<T>データのTypeを使用するように汎用コレクションに指示する暗黙の方法はありますか?ジェネリックリスト<T>のデータ型を暗黙に含めることはできますか?

任意のタイプは、IQueryableなどで覆い隠されている可能性があり、匿名タイプを含む可能性があるため、どのタイプにも着信があると仮定します。

var enumerableThings = //... enumerable<T> obtained from somewhere. 

ポイントはTです。不明です。

私は可算事の主要タイプのList<T>を作成したい:

var listOfThoseThings = new List<???>(enumerableThings); 

多くの興味深いメカニズムは、C#/にありますNET。私はこの仕事を実行する能力を見つけることに驚くことはないでしょう。しかし、現時点では簡潔な方法で私を避けています。

答えて

12

これはToList() extension methodが存在する理由です。

var listOfThoseThings = enumerableThings.ToList(); 

List<T>コンストラクタとは異なり、それはimplcitly一般的なパラメータを指定するには、型推論を使用することができます。

+0

これはもちろん、あなたの列挙型がlinq-sqlまたは他の長時間実行されているセットである場合に意味を持つ可能性のあるIEnumerableを列挙します。 – asawyer

+0

@asawyer:これはどのように 'List 'にも当てはまります。 – SLaks

+0

うん、ちょうど@JohnKのためにそれを気づいている。彼はこれを認識していないことを知っていないだろうと関数または何かでSQLクエリにlinqを十数回enumermを終了しました:) – asawyer

2

直接、これはしかし、間接的にジャストSLaks'(正しい)答えに展開する方法の型推論

public static List<T> CreateList<T>(IEnumerable<T> enumerableThings) 
{ 
    return new List<T>(enumerableThings); 
} 

var listOfThoseThings = CreateList(enumerableThings); 
0
static List<T> GetList<T>(IEnumerable<T> enumerableThings) 
{ 
    var listOfThoseThings = new List<T>(enumerableThings); 
    return listOfThoseThings; 
} 
4

を介して行うことができますする方法はありません。

ToListを呼び出すと、汎用メソッドEnumerable.ToList<T>(IEnumerable<T> source)が呼び出されます。コンパイラは通常の型推論を通常の方法で使用してTを解決します。

ToList,ToDictionaryおよびToArrayの呼び出しがありますが、現時点ではHashSetに相当するものはありません。これは、しかし書くことは非常に簡単です:この種のものをやって

public static class MoreExtensions 
{ 
    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source) 
    { 
     return new HashSet<T>(source); 
    } 

    public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source, 
     IEqualityComparer<T> comparer) 
    { 
     return new HashSet<T>(source, comparer); 
    } 
} 

は、ジェネリック医薬品の短い匿名型、ある型引数をジェネリック型のインスタンスを構築する唯一の方法です。それは良い仕事です:)

+0

その細部は非常に貴重です。ありがとう。 –

関連する問題