c# – 如何使用lambda / linq从集合中提取一些数据到对象?

我有一个IList< Animals> farmAnimals;

这个清单有三种类型,

>奶牛
>羊
>鸡

我如何使用lambda查询或linq-to-objects从列表中删除所有鸡,所以我有一个单独的鸡列表,原始列表现在只有奶牛和绵羊.

我是否必须制作三个列表(原始的2个新列表,已过滤)然后将原始列表清空?还是有一种比较棘手的方法?

结果需要

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

干杯!

澄清问题:

什么是更高效的? FindAll&删除所有与Where的建议?

最佳答案
假设:

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);
}

转载注明原文:c# – 如何使用lambda / linq从集合中提取一些数据到对象? - 代码日志