select 新的平均 linq

Average linq in select new

帮帮我

我有这个class:

public class CLASS_list_dati_esport_CATASTO
        {
            public Int64 Id_vertice;
            public string Denominazione;
            public string Materializzazione;
            public string Escluso;
            public string Origine;
            public string Stato;
            public string Ordine_cat;
            public string Ordine_roma40;
            public string Relazione_bessell;
            public string Relazione_roma40;
            public string Posizione_da_cartografia;
            public string Posizione_dai_registri;
            public double Media_nord;
            public double Nord;
            public double Media_est;
            public double Est;
            public string Cord_fittizia;
            public string Cord_esclusa;
        }

并且这条语句:

List<CLASS_list_dati_esport_CATASTO> list_dati_esport_CATASTO = Carica_list_dati_CATASTO();

(Carica_list_data_CATASTO()是在list_data_esport_CATASTO中添加元素的函数).

我想提取 list_data_esport_CATASTO 和项目 'Media_est' 中的所有元素,我想分配根据字段 'est' 分组的项目的平均值 id_vertice.

    var query = from elemento in list_dati_esport_CATASTO


                select new CLASS_list_dati_esport_CATASTO
                {
                    Id_vertice = elemento.Id_vertice,
                    Denominazione =elemento.Denominazione,
                    Materializzazione= elemento.Materializzazione,
                    Escluso = elemento.Escluso,
                    Origine = elemento.Origine,
                    Stato = elemento.Stato,
                    Ordine_cat = elemento.Ordine_cat,
                    Ordine_roma40 = elemento.Ordine_roma40,
                    Relazione_bessell = elemento.Relazione_bessell,
                    Relazione_roma40 = elemento.Relazione_roma40,
                    Posizione_da_cartografia = elemento.Posizione_da_cartografia,
                    Posizione_dai_registri = elemento.Posizione_dai_registri,
                    Media_nord = elemento.Media_nord,
                    Nord = elemento.Nord,

                    Media_est = from sottoelemento in list_dati_esport_CATASTO group sottoelemento by sottoelemento.Id_vertice into raggruppamento select new { Media_nord = raggruppamento.Average(p => p.est)},

                    Est = elemento.Est,
                    Cord_fittizia = elemento.Cord_fittizia,
                    Cord_esclusa = elemento.Cord_esclusa
                };




    foreach (var item in query)
    {
        MessageBox.Show(item.Media_est.ToString());
    }

但是

from sottoelemento in list_dati_esport_CATASTO group sottoelemento by sottoelemento.Id_vertice into raggruppamento select new { Media_nord = raggruppamento.Average(p => p.est)}

肯定是错的。

Linq 是一个读取操作的查询,尝试同时读取和写入平均值是行不通的。试试下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<CLASS_list_dati_esport_CATASTO> list_dati_esport_CATASTO = new List<CLASS_list_dati_esport_CATASTO>();

            var query = list_dati_esport_CATASTO
                .GroupBy(x => x.Id_vertice)
                .Select(x => new { esport_CATASTO = x.First(), average = x.Average(y => y.Est) })
                .ToList();

            foreach (var item in query)
            {
                item.esport_CATASTO.Est = item.average;
            }

            List<CLASS_list_dati_esport_CATASTO> results = query.Select(x => x.esport_CATASTO).ToList();

        }
    }
    public class CLASS_list_dati_esport_CATASTO
    {
        public Int64 Id_vertice;
        public string Denominazione;
        public string Materializzazione;
        public string Escluso;
        public string Origine;
        public string Stato;
        public string Ordine_cat;
        public string Ordine_roma40;
        public string Relazione_bessell;
        public string Relazione_roma40;
        public string Posizione_da_cartografia;
        public string Posizione_dai_registri;
        public double Media_nord;
        public double Nord;
        public double Media_est;
        public double Est;
        public string Cord_fittizia;
        public string Cord_esclusa;
    }
}

您可以按 IdVertice 对数据进行分组,计算平均值 Est 并将其放入字典中。

var list = new List<Model>
{
    new Model { IdVertice = 1, MediaEst = 30.0, Est = 15.0 },
    new Model { IdVertice = 1, MediaEst = 20.0, Est = 10.0 },
    new Model { IdVertice = 2, MediaEst = 35.0, Est = 25.0 },
    new Model { IdVertice = 2, MediaEst = 30.0, Est = 17.0 },
    new Model { IdVertice = 2, MediaEst = 31.0, Est = 15.0 }
};

var dict =
    (from el in list
    group el by el.IdVertice into gr
    select gr).ToDictionary(k => k.Key, v => v.Average(x => x.Est));

然后通过IdVertice key:

从字典中为每个元素拉出一个值(即Est的平均值)
foreach (var el in list)
{
    el.MediaEst = dict.TryGetValue(el.IdVertice, out double value) ? value : el.MediaEst;
}