LINQ to Object Query

时间:2009-09-03 23:42:36

标签: c# linq

我需要有关特定LINQ查询的帮助(我仍然很害怕em'!)

背景资料:

我有一个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");

这给了我“高”的计数,但没有按要素类型进行过滤。

有可能吗?是否可以在一个声明中做到?

2 个答案:

答案 0 :(得分:3)

你走在正确的轨道上。只需添加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);

答案 1 :(得分:2)

另一种方式:

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