Средний linq в выберите новый - PullRequest
0 голосов
/ 22 марта 2020

Помогите мне

У меня есть этот класс:

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

определенно не так.

Ответы [ 2 ]

1 голос
/ 22 марта 2020

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 голосов
/ 22 марта 2020

Вы можете сгруппировать ваши данные по 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;
}
...