сгруппировать по одному полю, вывести сумму других полей c#

Есть 3 класса, Элементы, Дефекты и Шапки.

Класс Элементы:

public class Element
{      
    public int Number { get; set; }
    public DateTime DateOfSearchDeffect { get; set; }
    public string ReportNumber { get; set; }
    public double DefectKilometer { get; set; }
    public int NumberOfSection { get; set; }
    public double DefectDistanseRelative { get; set; }
    public string DefectDistanseAbsolute { get; set; }
    public int NumberOfDeffect { get; set; }
    public string DefectDescription { get; set; }
}

Класс Дефект

public class Defect
{
    public List<Element> Elements { get; set; }
    public DefectHeader Header { get; set; }
    public int PipelineBranch { get; set; }
    public int PipelineWeldedJoint { get; set; }
    public int PipelineMetalLoss { get; set; }

    public Defect(List<Element> list, DefectHeader headerDeffect)
    {
        Elements = list;
        Header = headerDeffect;
    }

    public int NumberOfDifferentDefects()
    {
        return Elements.Count;
    }
}

И класс ШапкаДефектов

public class DefectHeader
{

    public string DefectHeaderOst { get; set; }
    public string DefectHeaderPipeLine { get; set; }
    public string DefectHeaderPipeLineZone { get; set; }
    public DateTime DefectHeaderDateOfLastStart { get; set; }
    public string DefectHeaderNumberOfLastDescription { get; set; }
    public string DefectHeaderFree1 { get; set; }
    public string DefectHeaderFree2 { get; set; }

    public override string ToString()
    {
        return "OST " + DefectHeaderOst + "\n Nefteprovod " + DefectHeaderPipeLine + "\n Uchastok " + DefectHeaderPipeLineZone + " \n Data poslednego progona " + DefectHeaderDateOfLastStart + " \n # poslednego otcheta " + DefectHeaderNumberOfLastDescription;
    }
}

В классе элемент лежат определенные поля, класс ДефектХеадер это шапки документов. Класс Дефект состоит из листа элементов и шапки. Так вот, мне необходимо взять список дефектов, сгруппировать их по полю Header.DefectHeaderNumberOfLastDescription и сложить поля(

    public int PipelineBranch { get; set; }

    public int PipelineWeldedJoint { get; set; }

    public int PipelineMetalLoss { get; set; }
    

) этих элементов.

Т.е мне надо чтобы все элементы с одинаковым Header.DefectHeaderNumberOfLastDescription "схлопнулись" в одну запись, но их поля проссумировались.

Вроде вычитал, что мне должны помочь GroupBy() и Sum() в LINQ, но не могу правильно написать. Или без линка.


Ответы (1 шт):

Автор решения: A K

Ваш пример ничем не отличается от типового примера на .GroupBy и .Sum и я думаю, что через некоторое время вы освоите этот синтаксис:

var result = myList.GroupBy(x => x.Header.DefectHeaderNumberOfLastDescription)
                   .Select(x => new {
                        DefectHeaderNumberOfLastDescription = x.Key,
                        PipelineBranch = x.Sum(y => y.PipelineBranch),
                        PipelineWeldedJoint = x.Sum(y => y.PipelineWeldedJoint)
                    });
→ Ссылка