【问题标题】:How to filter the List using C# LINQ如何使用 C# LINQ 过滤列表
【发布时间】:2016-09-30 19:21:58
【问题描述】:

我有一个元素列表。我需要在类别名称为“XYZ”的每个属性上使用过滤器获取所有元素。

以下查询肯定会对属性进行过滤以选择类别名称为“XYZ”的属性,但我也想要这些过滤属性的元素详细信息。

var filteredAttributes = attributes.Where(at => at.Categories.Any(ca => ca.Name == "XYZ")).Any()).ToList();

但是,如果我对元素进行相同的过滤,我会得到所有没有对属性进行过滤的元素。 是否可以创建单行查询来过滤元素以获取必要的属性?

这是我尝试失败的 LINQ 查询:

var filteredElements = elements.Where(el => el.attributes.Where(at => at.Categories.Any(ca => ca.Name == "Alarm")).Any()).ToList();

以下是定义的类:

public class Element
{
    public string Name { get; set; }
    public string ID { get; set; }
    public Boolean HasChildren { get; set; }
    public List<Attribute> Attributes { get; set; }
}
    public class Attribute
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Value { get; set; }
    public string WebID { get; set; }
    public List<Category> Categories { get; set; }
}

public class Category 
{
    public string Name { get; set; }
    public string Description { get; set; }
}

【问题讨论】:

  • 你所说的“失败”是什么意思?抛出异常还是不是预期的结果?
  • 为什么要限制为单行 lambda?这样做可能会妨碍可读性和可维护性。
  • 不就是var filteredElements = elements.Where(el =&gt; el.attributes.Any(ca =&gt; ca.Name == "Alarm"))吗?
  • @Fabio 不确定你为什么删除了你的答案......我不同意 OP 写的关于它的批评“但我也想要这些过滤属性的元素细节。”
  • 您的代码示例有不匹配的括号。我认为有可能做你想做的事,我只是不知道那是什么。

标签: c# linq


【解决方案1】:

只需将您的第一个查询放入 Where 中的 elements
我认为在属性上使用Any 就足够了,在类别上使用内部Any

var filteredElements = 
    elements.Where(el => 
    {
        return el.attributes.Any(at => at.Categories.Any(ca => ca.Name.Equals("Alarm")));
    }).ToList();

【讨论】:

  • 这在功能上等同于提供的第一个示例 OP,因为 Any() 将接受 Where() 过滤器并且行为相同。
  • @krillgar 在第一个示例中 OP 写道缺少元素......看起来元素是属性的父级...... OP 应该澄清
  • @Fabio- 我尝试了同样的事情。它不起作用。您的解决方案与 elements.Where(el => el.attributes.Where(at => at.Categories.Any(ca => ca.Name == "Alarm")).Any()).ToList();
  • @Fabio - 它基本上返回整个列表,没有任何过滤器
  • @Ramji,恐怕你需要检查集合是否实际包含名称为“Alarm”的Category
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 2011-07-02
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多