Как использовать List <T>.Find () в простой коллекции, которая не реализует Find ()? - PullRequest
1 голос
/ 07 апреля 2010

Я хочу использовать List.Find () для простой коллекции, которая не реализует Find ().Наивный способ, о котором я подумал, это просто обернуть его списком и выполнить .Find (), например:

ICollection myCows = GetAllCowsFromFarm(); // whatever the collection impl. is...
var steak = new List<Cow>(myCows).Find(moo => moo.Name == "La Vache qui Rit");

Теперь, 1-й из всех, что я хотел бы знать, C # -wise,Какова стоимость этой упаковки?Все еще быстрее «за» эту коллекцию традиционным способом?

Во-вторых, есть ли лучший простой способ элегантно использовать этот .Find ()?

Ура!

Ответы [ 4 ]

4 голосов
/ 07 апреля 2010

List<T>, когда создается с IEnumerable (т. Е. Ваш ICollection), копирует содержимое. Это может быть дорого.

У вас есть LINQ? Если это так, вы можете использовать метод расширения First, который возвращает первое найденное совпадение (или выдает исключение, если совпадения нет). Это будет работать на любом IEnumerable<T>:

var cattle = GetAllCows();
var steak = cattle.First(moo => moo.Name == "La Vache qui Rit");

Вы также можете использовать Where, который вернет все совпадения:

var cattle = GetAllCows();
var matches = cattle.Where(moo => moo.Name == "La Vache qui Rit");

В классе Enumerable есть куча полезных методов расширения. LINQ не только для баз данных.

1 голос
/ 07 апреля 2010

Использование Enumerable.Where:

var steak = myCows.Where(moo => moo.Name == "La Vache qui Rit");

Преимущество этого в том, что вы не стоите полной копии коллекции.@ Роджер лучше ответит.

0 голосов
/ 08 апреля 2010

Я просто добавлю вам, ребята, использование .FirstOrDefault (), чтобы избежать исключения, WDYT?

0 голосов
/ 07 апреля 2010

Вы можете использовать linq для этого:

using System.Linq;

...

var steak = myCows.First(moo => moo.Name == "La Vache qui Rit"); 
...