3

我有一个IList<Animals> farmAnimals;

这个列表有三种类型,

  • 奶牛

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

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

结果必须是

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

干杯!

澄清问题:

什么性能更高?FindAll 和 RemoveAll 与 Where 建议?

4

4 回答 4

3

假设:

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);
}
于 2009-01-14T01:47:13.067 回答
2
var chickens = farmAnimals.ToList().FindAll (c => c.Type == "Chicken");
farmAnimals.RemoveAll(a => a.Type=="Chicken");
于 2009-01-14T01:33:25.840 回答
2
var chickens = farmAnimals.Where(a => a.GetType() == typeof(Chicken)).ToList();
farmAnimals = farmAnimals.Where(a => a.GetType() != typeof(Chicken)).ToList();
于 2009-01-14T01:40:05.623 回答
0

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

我有一种可怕的倾向,倾向于尽可能简单的解决方案。在这种情况下,使用 lambda 只需要 .NET Framework 2.0。LINQ 扩展方法需要 3.5。

于 2009-01-14T01:44:19.530 回答