我是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'System.Linq.IGrouping'不包含'energyType'的定义,并且找不到扩展方法'energyType'接受类型为'System.Linq.IGrouping'的第一个参数(您是否缺少using指令或程序集参考?)c:\ users \ rudi \ documents \ Visual Studio 2013 \ projects \ plooscassandra \ plooscassandra \ handlers \ meterbuilder.cs 108136 PloosCassandra
为什么找不到
x.energyType
? 最佳答案
由于您进行了分组,因此x
的lambda中的Select
是IGrouping<CsvMeter>
-而不是单个CsvMeter
。
此IGrouping<CsvMeter>
具有您在上面创建的匿名类型的Key
属性,并进一步表示一系列CsvMeter
实例。
由于您已经对该序列进行了Sum
操作的求和,因此您实际上应该已经知道这一点。问题是,您要如何汇总序列中所有energyType
实例的CsvMeter
,以为生成的新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 })
//...
并在
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
的参数,并且该参数将返回而没有任何更改。相反,您使用一些newMeterList
并且未显示其声明。对于我的回答,我认为您的意图是:public List<CSVMeter> getDisctinctMeters(List<CSVMeter> meterList)
{
var newMeterList = meterList.GroupBy // shortened for clarity
return newMeterList;
}