代码之家  ›  专栏  ›  技术社区  ›  ahawker

LINQ到对象查询

  •  1
  • ahawker  · 技术社区  · 16 年前

    背景资料:

    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选择一个特定的数据条目,然后给出该条目的数据项总数等于一个特定值的计数。

    我试图从featuretype等于“foobar”的数据条目中获取“高”值和“低”值的计数。

    我得到的最接近的结果是:

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

    可能吗?可以用一句话来表达吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Mehrdad Afshari    16 年前

    你在正确的轨道上。只需添加一个 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);
    
        2
  •  2
  •   Mehmet Aras    16 年前

    另一种方式:

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