Почему в RepeaterItemCollection нет методов расширения LINQ, несмотря на то, что он реализует IEnumerable? - PullRequest
12 голосов
/ 06 июля 2010

Почему в RepeaterItemCollection нет методов расширения LINQ, несмотря на то, что он реализует IEnumerable?

Я использую Linq для объектов в другом месте того же класса. Однако, когда я пытаюсь сделать это с RepeaterItemCollection, они не доступны. У меня сложилось впечатление, что методы расширения LINQ были доступны для классов, которые реализуют IEnumerable.

Чего мне не хватает?

Ответы [ 3 ]

22 голосов
/ 06 июля 2010

Он реализует IEnumerable, но не IEnumerable<T>.

Это не значит, что вы не можете его использовать - это часть того, для чего OfType и Cast, для построения общей последовательности из неуниверсальной последовательности :

var filtered = items.Cast<RepeaterItem>()
                    .Where(...) // Or whatever
                    .ToList();

В этом случае Cast более подходит, чем OfType, так как вы должны быть уверены, что он будет содержать только значения RepeaterItem. Обратите внимание, что Cast - это то, что используется, если вы указали тип переменной диапазона в выражении запроса, поэтому это тоже будет работать:

var query = from RepeaterItem item in items
            where item.ItemType == ListItemType.SelectedItem
            select item.DataItem;
2 голосов
/ 06 июля 2010

Для работы с LINQ необходимо реализовать универсальный IEnumerable<>, а это не так.

Однако вы можете сначала «привести» его к нужному типу с помощью метода расширения Cast<>.

1 голос
/ 06 июля 2010

Согласно MSDN , он имеет следующие 4 метода расширения:

  • AsParallel()
  • AsQueryable()
  • Cast<TResult>()
  • OfType<TResult>()
...