2011-01-31 67 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

這當然會枚舉IEnumerable時被調用,這可能會影響,如果你的枚舉是linq-sql或任何其他長期運行的集合。 – asawyer 2011-01-31 19:11:59

+0

@asawyer:對於任何`List `這都是如此,無論你如何創建它。 – SLaks 2011-01-31 19:22:23

2

沒有辦法直接做到這一點但它可以通過方法類型推斷

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

間接地做到了對SLaks擴大(正確的)答案。

當您撥打ToList時,即調用通用方法Enumerable.ToList<T>(IEnumerable<T> source)。編譯器然後以普通方式使用泛型類型推斷來計算出T

請注意,目前雖然有電話ToList,ToDictionaryToArray,但沒有等效的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); 
    } 
} 

做這樣的事情是一個類型參數,它是一個匿名類型,泛型短的構造泛型類型的實例的唯一方式。這是一個很好的工作,這很容易:)

相關問題