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

c# linq改变了构造函数,不能添加新值

由于您进行了分组,Select的lambda中的xIGrouping<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