c# - 如何使用 lambda/linq to objects 从集合中提取一些数据?

标签 c# .net lambda linq-to-objects

我有一个 IList<Animals> farmAnimals;

这个列表有三种类型,

  • 奶牛
  • 绵羊

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

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

结果需要是

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

干杯!

澄清问题:

什么更高效? FindAll 和 RemoveAll 与 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 to objects 从集合中提取一些数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/441576/

相关文章:

c# - Uri.TryCreate 对任何字符串值返回 true?

c# - 我们如何通过在 asp.net 应用程序中单击按钮来清除服务器端缓存?

c# - 从委托(delegate)过滤器表达式中获取对象 Expression<Func<T,bool>>

java - Eclipse:构造函数未定义

java - lambda 表达式中不兼容的参数类型

c# - 使用 Canvas 按钮加载场景

c# - 对 "copy"列表所做的更改反射(reflect)了原始列表 - c#

.net - VB.NET迭代器函数丢失局部变量

c# - 使用 sdf 文件的 Linq to SQL 异常

c# - 目前接受的使用 C# 4.0 从 SQL Server 检索数据的方法是什么?