是否有隐含的方法告诉通用集合使用传入的Type
数据的IEnumerable<T>
?
假设任何Type都可以传入,因为它可能已被遮挡,例如,通过IQueryable并且可能包含匿名类型。
var enumerableThings = //... enumerable<T> obtained from somewhere.
关键是T未知。
我想创建一个List<T>
可枚举事物的主要类型:
var listOfThoseThings = new List<???>(enumerableThings);
C#/ .NET中有许多有趣的机制。找到执行这项任务的能力我不会感到惊讶;然而,此刻一种简洁的方式躲避了我。
答案 0 :(得分:12)
这就是ToList()
extension method存在的原因。
var listOfThoseThings = enumerableThings.ToList();
与List<T>
构造函数不同,它可以使用类型推断来有意义地指定泛型参数。
答案 1 :(得分:4)
只是扩展SLaks(正确)答案。
当你致电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);
}
}
执行此类操作是构建泛型类型实例的 only 方法,其类型参数是匿名类型,缺少泛型。这很好,很容易:)
答案 2 :(得分:2)
无法直接执行此操作,但可以通过方法类型推断间接完成此操作
public static List<T> CreateList<T>(IEnumerable<T> enumerableThings)
{
return new List<T>(enumerableThings);
}
var listOfThoseThings = CreateList(enumerableThings);
答案 3 :(得分:0)
static List<T> GetList<T>(IEnumerable<T> enumerableThings)
{
var listOfThoseThings = new List<T>(enumerableThings);
return listOfThoseThings;
}