我是LinQ的新手,并在几周前开始使用它。所以也许我对LinQ如何工作有错误的理解。我还尝试使用如下所述的空构造函数:Invoke constructor inside a linq query
我改变了一个类的构造函数。我添加了实体energyType
public CSVMeter(int meterID, DateTime datum, int numberOfValues, double total, double total2, double qualityScore, int energyType)
{
this.MeterID = meterID;
this.Datum = datum;
this.NumberOfValues = numberOfValues;
this.total = total;
this.total2 = total2;
this.qualityScore = qualityScore;
this.energyType = energyType;
}
我有以下LinQ查询。
public List<CSVMeter> getDisctinctMeters(List<CSVMeter> meterList)
{
newMeterList = newMeterList.GroupBy(x => new { x.MeterID, x.Datum })
.Select(x => new CSVMeter(
x.Key.MeterID,
x.Key.Datum,
x.Sum(s => s.NumberOfValues),
x.Sum(s => s.total),
x.Sum(s => s.total2),
0,
x.energyType))
.ToList();
return meterList;
}
但是我在x.energyType
错误2&#39; System.Linq.IGrouping&#39;不包含&#39; energyType&#39;的定义没有扩展方法&#39; energyType&#39;接受类型&#39; System.Linq.IGrouping&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)c:\ users \ rudi \ documents \ visual studio 2013 \ projects \ plooscassandra \ plooscassandra \ handlers \ meterbuilder.cs 108 136 PloosCassandra
为什么我找不到x.energyType
?
答案 0 :(得分:2)
自您进行分组后,x
的lambda中的Select
为IGrouping<CsvMeter>
- 而不是单 {{1} }。
此CsvMeter
具有您在上面创建的匿名类型的IGrouping<CsvMeter>
属性,并进一步表示Key
个实例的序列。
由于您已经对该序列进行了CsvMeter
次操作,因此您实际应该知道这一点。问题是,您希望汇总序列中所有Sum
个实例的energyType
,以评估生成的新CsvMeter
的{{1}} 。以下是如何简单地使用组中第一个元素的energyType
:
CsvMeter
energyType
返回组中的第一个newMeterList.GroupBy(x => new { x.MeterID, x.Datum })
.Select(x => new CSVMeter(
x.Key.MeterID,
x.Key.Datum,
x.Sum(s => s.NumberOfValues),
x.Sum(s => s.total),
x.Sum(s => s.total2),
0,
x.First().energyType))
.ToList();
实例。
但也许你真的想用这种能量类型对First()
个实例进行分组。所以你可以将分组改为
CsvMeter
并在CsvMeter
:
newMeterList.GroupBy(x => new { x.MeterID, x.Datum, x.energyType })
//...
BTW你的代码看起来有点奇怪:你的Select
接受一个名为.Select(x => new CSVMeter(
x.Key.MeterID,
x.Key.Datum,
x.Sum(s => s.NumberOfValues),
x.Sum(s => s.total),
x.Sum(s => s.total2),
0,
x.Key.energyType))
的参数,并且返回时没有任何变化。相反,你使用一些getDisctinctMeters
并没有显示它的声明。对于我的回答,我认为你的意图是:
meterList
答案 1 :(得分:1)
GroupBy
的返回类型为IGouping
,代表群组本身,而不是IEnumerable<CSVMeter>
,因此x
没有属性energyType
。话虽如此,你必须澄清该组的哪个成员必须选择energyType
;分组表达式中未使用energyType
。