сгруппировать по одному полю, вывести сумму других полей 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 шт):
Ваш пример ничем не отличается от типового примера на .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)
});