首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用lambda/linq从集合中提取一些数据到对象?

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

Stack Overflow用户
提问于 2009-01-14 01:24:22
回答 4查看 8.7K关注 0票数 3

我有一个IList<Animals> farmAnimals;

这个列表有三种类型,

  • 母牛
  • 鸡群

如何使用lambda查询或linq to对象将所有鸡从列表中删除,以便我有一个单独的鸡列表,而最初的列表现在只有奶牛和绵羊。

我是否必须列出三个列表(原来的+2个新列表,过滤后),然后使原始列表无效?还是有更棘手的方法?

结果需要

代码语言:javascript
复制
IList<Aniamls> chickens;
IList<Animals> farmAnimals; // only contains the cows and sheep, now.

干杯!

澄清问题:

什么更有表现力?FindAll & RemoveAll对哪里的建议?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-14 01:47:13

假设:

代码语言:javascript
复制
public abstract class Animal {}

public class Chicken : Animal {}

你可以:

代码语言:javascript
复制
var chickens = animals.OfType<Chicken>().Cast<Animal>().ToList();

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

编辑

任何合理的答案都应该是O(n),这意味着原始列表中的每个项目只处理一次。因此,我建议采取一种必要的办法:

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2009-01-14 01:33:25

代码语言:javascript
复制
var chickens = farmAnimals.ToList().FindAll (c => c.Type == "Chicken");
farmAnimals.RemoveAll(a => a.Type=="Chicken");
票数 2
EN

Stack Overflow用户

发布于 2009-01-14 01:40:05

代码语言:javascript
复制
var chickens = farmAnimals.Where(a => a.GetType() == typeof(Chicken)).ToList();
farmAnimals = farmAnimals.Where(a => a.GetType() != typeof(Chicken)).ToList();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/441576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档