c# linq改变了构造函数,不能添加新值
本文关键字:不能 添加 新值 构造函数 linq 改变 | 更新日期: 2023-09-27 18:01:33
我是LinQ的新手,几周前开始使用它。所以也许我对LinQ的工作方式有错误的理解。在linq查询
中调用构造函数我改变了一个类的构造函数。我添加了实体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"的第一个参数。c:'users'rudi'documents'visual studio 2013'projects'plooscassandra'plooscassandra'handlers'meterbuilder.cs 108 136 plooscassandra
为什么我找不到x.energyType
由于您进行了分组,Select
的lambda中的x
是IGrouping<CsvMeter>
-而不是单个 CsvMeter
。
这个IGrouping<CsvMeter>
具有上面创建的匿名类型的Key
属性,并进一步表示CsvMeter
实例的序列。
由于您已经对该序列进行了sum Sum
操作,因此您实际上应该知道这一点。问题是,您希望如何聚合序列中所有CsvMeter
实例的 energyType
,以便为生成的新CsvMeter
评估energyType
。下面是如何简单地使用组中第一个元素的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;
}
GroupBy
的返回类型是IGouping
,代表组本身,而不是IEnumerable<CSVMeter>
,所以x
没有属性energyType
。话虽如此,你必须澄清energyType
必须被选为该组的哪个成员;分组表达式中不使用energyType