Запрос LINQ для создания вывода типа XML в консольных окнах и XML-файла

#c# #linq #console-application

Вопрос:

Я новичок в программировании и все еще учусь, работая над LINQ, я создал очень небольшой код, который сгруппировал массив int в виде пакетов, запрос LINQ, который я использую, отображает простой вывод, что не является моим требованием, я хочу, чтобы следующий вывод в консольных окнах с помощью запроса LINQ, пожалуйста, помогите мне.

Вывод в окне консоли

 <Results>
<Result>
    <Marks>60</Marks>
    <Marks>50</Marks>
    <Marks>70</Marks>
    <Total>180</Total>
</Result>
<Result>
    <Marks>30</Marks>
    <Marks>80</Marks>
    <Marks>65</Marks>
    <Total>175</Total>
</Result>
<Result>
    <Marks>90</Marks>
    <Marks>75</Marks>
    <Marks>55</Marks>
    <Total>220</Total>
</Result>
 

Мой код таков

  static void Main(string[] args)
    {
        List<int> email = new List<int>() { 60, 50, 70, 30, 80, 65, 90, 75, 55 };

        foreach (var batch in email.Batch(3))
        {
            Console.WriteLine(String.Join(",", batch));
        }

        Console.ReadLine();
    }
 

Запрос LINQ

   public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items,
                                                  int maxItems)
    {
        return items.Select((item, inx) => new { item, inx })
                    .GroupBy(x => x.inx / maxItems)
                    .Select(g => g.Select(x => x.item));
    }
 

Ответ №1:

Да, LINQ to XML делает это очень простым — вы можете передавать элементы, включая последовательности элементов, в XElement конструктор, и они включаются вложенным способом:

 using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml.Linq;

static class Extensions
{
    public static IEnumerable<IEnumerable<T>> Batch<T>(
        this IEnumerable<T> items, int maxItems) =>
        items.Select((item, inx) => new { item, inx })
             .GroupBy(x => x.inx / maxItems)
             .Select(g => g.Select(x => x.item));
}

class Program
{
    static void Main(string[] args)
    {
        List<int> email = new List<int>() { 60, 50, 70, 30, 80, 65, 90, 75, 55 };

        var element = new XElement("Results",
            email.Batch(3)
                 // Each batch creates a new Result element
                 .Select(batch =>
                     new XElement("Result",
                                  // Each element of the batch creates a Mark
                                  batch.Select(mark => new XElement("Mark", mark)),
                                  // The batch also has a Total element
                                  new XElement("Total", batch.Sum()))));
        Console.WriteLine(element);
    }
}