Как извлечь некоторые данные из коллекции, используя lambda / linq для объектов? - PullRequest
3 голосов
/ 14 января 2009

у меня есть IList<Animals> farmAnimals;

этот список имеет три типа,

  • Коровы
  • Sheep
  • Куры

как я могу удалить всех цыплят из списка, используя лямбда-запрос или linq-to-objects , поэтому у меня есть отдельный список цыплят, и теперь в исходном списке только коровы и овцы.

Должен ли я создать три списка (исходные + 2 новых, отфильтрованные) и затем обнулить исходный список? или есть хитрый способ?

результат должен быть

IList<Aniamls> chickens;
IList<Animals> farmAnimals; // only contains the cows and sheep, now.

ура!

УТОЧНЕНИЕ ВОПРОСА:

что является более производительным? FindAll & RemoveAll и предложение Where?

Ответы [ 4 ]

3 голосов
/ 14 января 2009

Предполагая, что:

public abstract class Animal {}

public class Chicken : Animal {}

Вы можете сделать:

var chickens = animals.OfType<Chicken>().Cast<Animal>().ToList();

var nonChickens = animals.Except(chickens).ToList();

Редактировать

Любой разумный ответ должен быть O (n) , то есть каждый элемент в исходном списке обрабатывается только один раз. Поэтому я бы предложил императивный подход:

var chickens = new List<Animal>();
var nonChickens = new List<Animal>();

foreach(var animal in animals)
{
    var list = animal is Chicken ? chickens : nonChickens;

    list.Add(animal);
}
2 голосов
/ 14 января 2009
var chickens = farmAnimals.Where(a => a.GetType() == typeof(Chicken)).ToList();
farmAnimals = farmAnimals.Where(a => a.GetType() != typeof(Chicken)).ToList();
2 голосов
/ 14 января 2009
var chickens = farmAnimals.ToList().FindAll (c => c.Type == "Chicken");
farmAnimals.RemoveAll(a => a.Type=="Chicken");
0 голосов
/ 14 января 2009

var Chickens = farmAnimals.FindAll (a => a - Chicken);

У меня ужасная склонность к простейшему решению. В этом случае для использования лямбды требуется только .NET Framework 2.0. Методы расширения LINQ требуют 3.5.

...