是否可以隐含通用List <t>的数据类型?</t>

时间:2011-01-31 18:57:43

标签: .net collections c#-4.0 ienumerable

是否有隐含的方法告诉通用集合使用传入的Type数据的IEnumerable<T>

假设任何Type都可以传入,因为它可能已被遮挡,例如,通过IQueryable并且可能包含匿名类型。

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

关键是T未知。

我想创建一个List<T>可枚举事物的主要类型:

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

C#/ .NET中有许多有趣的机制。找到执行这项任务的能力我不会感到惊讶;然而,此刻一种简洁的方式躲避了我。

4 个答案:

答案 0 :(得分:12)

这就是ToList() extension method存在的原因。

var listOfThoseThings = enumerableThings.ToList();

List<T>构造函数不同,它可以使用类型推断来有意义地指定泛型参数。

答案 1 :(得分:4)

只是扩展SLaks(正确)答案。

当你致电ToList时,那就是调用通用方法Enumerable.ToList<T>(IEnumerable<T> source)。然后,编译器以正常方式使用泛型类型推断来计算T

请注意,目前虽然有ToListToDictionaryToArray,但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;
}