2011-01-31 1 views
2

Есть ли неявный способ рассказать об общей коллекции для использования Type входящих IEnumerable<T> данных?Может ли подразумеваться тип данных для общего списка <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

+0

@asawyer: Это верно для любого 'List ', независимо от того, как вы его создаете. – SLaks

+0

Да, просто отметив это для @JohnK. Не хотел бы узнать, что он этого не понимал, и закончил переписывание linq в sql-запрос дюжину раз в функции или что-то еще :) – asawyer

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, 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

Эта деталь неоценима. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^