【问题标题】:LINQ to Object QueryLINQ 到对象查询
【发布时间】:2009-09-04 11:21:36
【问题描述】:

我需要有关特定 LINQ 查询的帮助(我仍然很讨厌他们!)

背景信息:

我有一个类 DataEntry:

class DataEntry{
    public Attribute Attribute{get; set;}
    public List<object> Data{get; set;}

属性类:

class Attribute{
    public string FeatureName{get; set;}
    public Types FeatureType{get; set;}
    public List<object> PossibleValues{get; set;}

我最终将拥有大约 20 个不同的数据条目,每个条目大约有 1000 个数据对象。我要做的是编写一个 LINQ 查询来根据 FeatureType 选择一个特定的数据条目,然后给我一个该条目的数据项总数等于特定值的计数。

我想要得到的是特征类型等于“foobar”的数据条目中“高”值和“低”值的计数。

我得到的最接近的是:

int count = dataset.SelectMany(i => i.Data).Count(j => j.ToString() == "high");

这给了我“高”的计数,但不按特征类型过滤。

有可能吗?是否可以在单个语句中完成?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    你在正确的轨道上。只需添加一个Where 方法来过滤掉东西,然后再将它们提供给SelectMany

    dataset.Where(i => i.Attribute.FeatureType == Types.FooBar)
           .SelectMany(i => i.Data)
           .Count(j => j.ToString() == "high")
    

    要在单个语句中计算高低,您可以尝试:

    dataset.Where(i => i.Attribute.FeatureType == Types.FooBar)
           .SelectMany(i => i.Data)
           .Select(i => i.ToString())
           .Aggregate(new { High = 0, Low = 0 },
                (acc, i) => val == "high" ? new { High = i.High + 1, i.Low }
                          : val == "low"  ? new { i.High,  Low = i.Low + 1 } : acc);
    

    【讨论】:

    • 天啊。我的想法是正确的,但我无法弄清楚。谢谢。
    • 更喜欢方法链而不是 linq 查询语言。
    【解决方案2】:

    另一种方式:

    int count = 
    ( from dataEntry in dataset
      from data in dataEntry.Data
      where dataEntry.Attribute.FeatureType == Types.Foo && data.ToString() == "high"
      select data
    ).Count();
    

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2011-10-15
      相关资源
      最近更新 更多