Можно ли подразумевать тип данных для общего списка <T>? - PullRequest
2 голосов
/ 31 января 2011

Существует ли неявный способ указать универсальной коллекции использовать Type входящих IEnumerable<T> данных?

Предположим, что любой тип может быть входящим, поскольку он может быть скрыт, например, через IQueryable и может содержать анонимный тип.

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

Точка T неизвестна.

Я хочу создать List<T> первичного Типа перечислимой вещи:

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

В C # / .NET есть много интересных механизмов. Я не удивлюсь, если найду возможность выполнить эту задачу; однако на данный момент краткий путь уклоняется от меня.

Ответы [ 4 ]

12 голосов
/ 31 января 2011

Именно поэтому существует метод расширения ToList() .

var listOfThoseThings = enumerableThings.ToList();

В отличие от конструктора List<T>, он может использовать вывод типа для косвенного указания универсального параметра.

4 голосов
/ 31 января 2011

Просто чтобы расширить (правильный) ответ 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 голосов
/ 31 января 2011

Нет прямого способа сделать это, однако это можно сделать косвенным образом с помощью вывода типа метода

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

var listOfThoseThings = CreateList(enumerableThings);
0 голосов
/ 31 января 2011
static List<T> GetList<T>(IEnumerable<T> enumerableThings)
{
   var listOfThoseThings = new List<T>(enumerableThings);
   return listOfThoseThings;
}
...