Выравнивание текста по трем столбцам - PullRequest
1 голос
/ 20 июня 2019

Я хотел бы показать данные LinkedList в трех отдельных столбцах с List1, List2 и List3 в качестве заголовка столбца. Я не могу выровнять данные LinkedList по этим заголовкам.

        void LoopThruLinkedList(LinkedList<string> strList)
        {
            foreach(string str in strList)
            {
                Console.WriteLine(string.Format($"{str, -20}"));
            }
            //Console.WriteLine();
        }

        // Creating a linkedlist
        // Using LinkedList class
        LinkedList<string> my_list = new LinkedList<string>();

        // Adding elements in the LinkedList
        // Using AddLast() method
        my_list.AddLast("Zoya");
        my_list.AddLast("Shilpa");
        my_list.AddLast("Rohit");
        my_list.AddLast("Rohan");
        my_list.AddLast("Juhi");
        my_list.AddLast("Zoya");
        my_list.AddLast("Rohit");

        string List1 = "List One Students: ";
        string List2 = "List Two Students: ";
        string List3 = "List Three Students: ";

        Console.WriteLine($"{List1, -20}{List2, -20}{List3, -20}");


        // Accessing the elements of LinkedList using the foreach loop
        LoopThruLinkedList(my_list);
        LoopThruLinkedList(my_list);
        LoopThruLinkedList(my_list);

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Здесь много вопросов

  1. Зачем вам нужен связанный список?у них нет индексаторов, что делает любое решение неэффективным

Однако это может указать вам правильное направление

void LoopThruLinkedList(params LinkedList<string>[] strLists)
{
   var max = strLists.Max(x => x.Count());

   for (int i = 0; i < max; i++)
   {
      foreach (var item in strLists)
         Console.Write($"{(item.Count > i ? item.ElementAt(i) : ""),-20}");
      Console.WriteLine();
   }
}

// Creating a linkedlist
// Using LinkedList class
LinkedList<string> my_list = new LinkedList<string>();

// Adding elements in the LinkedList
// Using AddLast() method
my_list.AddLast("Zoya");
my_list.AddLast("Shilpa");
my_list.AddLast("Rohit");
my_list.AddLast("Rohan");
my_list.AddLast("Juhi");
my_list.AddLast("Zoya");
my_list.AddLast("Rohit");

string List1 = "List One Students: ";
string List2 = "List Two Students: ";
string List3 = "List Three Students: ";

Console.WriteLine($"{List1,-20}{List2,-20}{List3,-20}");


// Accessing the elements of LinkedList using the foreach loop
LoopThruLinkedList(my_list, my_list, my_list);

Или другой вариант, использующий перечисление 1015 * в операции сводного стиля с GroupBy

void LoopThruLinkedList(params LinkedList<string>[] strLists)
{
   var results = strLists
                .SelectMany(inner => inner.Select((item, index) => new { item, index }))
                .GroupBy(i => i.index, i => i.item)
                .Select(g => g.ToList());

   foreach (var list in results)
   {
      foreach (var item in list)
         Console.Write($"{item,-20}");
      Console.WriteLine();
   }
}
0 голосов
/ 20 июня 2019

Вот вариант, который использует только перечислители и поэтому более эффективен, чем доступ к элементам по индексу:

void PrintLists(LinkedList<string>[] lists, string[] captions)
{
    //Find the necessary column widths
    var columnWidths = new int[lists.Length];
    for(int i = 0; i < lists.Length; ++i)
    {
        columnWidths[i] = captions[i].Length;
        foreach (var s in lists[i])
            columnWidths[i] = Math.Max(columnWidths[i], s.Length);
        columnWidths[i] += 2; //spacing
    }

    //Print the headings
    for(int i = 0; i < lists.Length; ++i)
        Console.Write(captions[i].PadRight(columnWidths[i]));
    Console.WriteLine();

    //Initialize iterators
    var iterators = new LinkedList<string>.Enumerator[lists.Length];
    var iteratorsValid = new bool[lists.Length];
    for (int i = 0; i < lists.Length; ++i)
    {
        iterators[i] = lists[i].GetEnumerator();
        iteratorsValid[i] = iterators[i].MoveNext();
    }

    //Print the rest of the table
    while (iteratorsValid.Any(b => b))
    {
        for (int i = 0; i < lists.Length; ++i)
        {
            if (iteratorsValid[i])
            {
                var item = iterators[i].Current;
                Console.Write(item.PadRight(columnWidths[i]));
                iteratorsValid[i] = iterators[i].MoveNext();
            }
            else
                Console.Write(new String(' ', columnWidths[i]));
        }
        Console.WriteLine();
    }
}

Который вы называете как

PrintLists( new [] { my_list, my_list, my_list}, 
            new [] { "List One Students: ", "List Two Students: ", "List Three Students: " });     
...