我是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中的SelectIGrouping<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;
}

10-08 08:04