选择新的平均行数

问题描述 投票:0回答:2

帮助我

我有这堂课:

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'中的所有元素,我想根据字段id_vertice分配项目'est'的平均值。

    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)}

绝对是错误的。

c# linq-to-entities
2个回答
0
投票

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;
    }
}

0
投票

您可以按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));

然后通过Est键从该词典中为每个元素提取一个值(即IdVertice的平均值:

foreach (var el in list)
{
    el.MediaEst = dict.TryGetValue(el.IdVertice, out double value) ? value : el.MediaEst;
}
© www.soinside.com 2019 - 2024. All rights reserved.