Консоль. WriteLine и универсальный Список

Это то, что вы ищете?

$("button").attr('title', function(i, v) {
  $(this).siblings(".title").html(v);
})
.group {
  display: inline-block;
}

.btn {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="group">
  <button class="btn" title="Title Text 1">Button 1</button>
  <span class="title"></span>
</div>
<div class="group">
  <button class="btn" title="Title Text 2">Button 2</button>
  <span class="title"></span>
</div>
<div class="group">
  <button class="btn" title="Title Text 3">Button 3</button>
  <span class="title"></span>
</div>

36
задан Community 9 September 2008 в 22:13
поделиться

8 ответов

Сделайте это:

list.ForEach(i => Console.Write("{0}\t", i));
<час>

РЕДАКТИРОВАНИЕ: другим, которые ответили - он хочет их всех на той же строке с вкладками между ними.:)

74
ответ дан 27 November 2019 в 05:17
поделиться

Другой подход, только для ударов:

Console.WriteLine(string.Join("\t", list));
23
ответ дан 27 November 2019 в 05:17
поделиться

новый список {1, 3, 5} .ForEach (Console.WriteLine);

3
ответ дан 27 November 2019 в 05:17
поделиться
        List<int> a = new List<int>() { 1, 2, 3, 4, 5 };
        a.ForEach(p => Console.WriteLine(p));

редактирование: а-а-а он победил меня к нему.

2
ответ дан 27 November 2019 в 05:17
поделиться
list.ForEach(x=>Console.WriteLine(x));
2
ответ дан 27 November 2019 в 05:17
поделиться
List<int> list = new List<int> { 1, 3, 5 };
list.ForEach(x => Console.WriteLine(x));

Редактирование: Черт возьми! занял слишком много времени открывать Visual Studio для тестирования его.

2
ответ дан 27 November 2019 в 05:17
поделиться
public static void WriteLine(this List<int> theList)
{
  foreach (int i in list)
  {
    Console.Write("{0}\t", t.ToString());
  }
  Console.WriteLine();
}

Затем позже...

list.WriteLine();
0
ответ дан 27 November 2019 в 05:17
поделиться

Если есть фрагмент кода, который вы все время повторяете согласно «Не повторять себя», вы должны поместить его в свою собственную библиотеку и вызвать его. Имея это в виду, есть два аспекта, чтобы получить правильный ответ. Первое - это ясность и краткость кода, вызывающего библиотечную функцию. Второй - влияние foreach на производительность.

Сначала давайте подумаем о ясности и краткости вызывающего кода.

Вы можете выполнить цикл foreach несколькими способами:

  1. цикл for
  2. цикл foreach
  3. Collection.ForEach

Из всех способов выполнения цикла foreach List.ForEach с лямбой является наиболее понятным. и самый краткий.

list.ForEach(i => Console.Write("{0}\t", i));

Итак, на данном этапе может показаться, что List.ForEach - лучший способ. Однако какова производительность этого? Это' Верно, что в этом случае время записи в консоль будет определять производительность кода. Когда мы знаем что-то о производительности той или иной языковой функции, мы должны, по крайней мере, это рассмотреть.

Согласно измерениям производительности foreach Дастоном Кэмпбеллом , самый быстрый способ перебора списка в оптимизированном коде - это использовать for цикл без вызова List.Count.

Однако цикл for является многословной конструкцией. Это также рассматривается как очень итеративный способ делать что-то, что не соответствует текущей тенденции к функциональным идиомам.

Так можем ли мы добиться краткости, ясности и производительности? Мы можем использовать метод расширения. В идеальном мире мы бы создали метод расширения на консоли, который берет список и записывает его с разделителем. Мы можем' Я делаю это, потому что Console - это статический класс, а методы расширения работают только с экземплярами классов. Вместо этого нам нужно поместить метод расширения в сам список (согласно предложению Дэвида Б.):

public static void WriteLine(this List<int> theList)
{
  foreach (int i in list)
  {
    Console.Write("{0}\t", t.ToString());
  }
  Console.WriteLine();
}

Этот код будет использоваться во многих местах, поэтому мы должны выполнить следующие улучшения:

  • Вместо использования foreach мы должны используйте самый быстрый способ итерации коллекции, который представляет собой цикл for с кешированным счетчиком.
  • В настоящее время в качестве аргумента можно передавать только список. Как библиотечную функцию мы можем обобщить ее, приложив небольшие усилия.
  • Использование List ограничивает нас только списками, использование IList позволяет этому коду работать и с массивами.
  • Поскольку метод расширения будет находиться в IList, нам нужно изменить имя, чтобы было понятнее, что мы пишем:

Вот как будет выглядеть код функции:

public static void WriteToConsole<T>(this IList<T> collection)
{
    int count = collection.Count();
    for(int i = 0;  i < count; ++i)
    {
        Console.Write("{0}\t", collection[i].ToString(), delimiter);
    }
    Console.WriteLine();
}

Мы можем улучшить это еще больше, разрешив клиенту передать разделитель. Затем мы могли бы предоставить вторую функцию, которая записывает в консоль со стандартным разделителем, например:

public static void WriteToConsole<T>(this IList<T> collection)
{
    WriteToConsole<T>(collection, "\t");
}

public static void WriteToConsole<T>(this IList<T> collection, string delimiter)
{
    int count = collection.Count();
    for(int i = 0;  i < count; ++i)
    {
         Console.Write("{0}{1}", collection[i].ToString(), delimiter);
    }
    Console.WriteLine();
}

Итак, теперь, учитывая, что нам нужен краткий и понятный эффективный способ записи списков на консоль, у нас есть такой. Вот весь исходный код, включая демонстрацию использования функции библиотеки:

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

namespace ConsoleWritelineTest
{
    public static class Extensions
    {
        public static void WriteToConsole<T>(this IList<T> collection)
        {
            WriteToConsole<T>(collection, "\t");
        }

        public static void WriteToConsole<T>(this IList<T> collection, string delimiter)
        {
            int count = collection.Count();
            for(int i = 0;  i < count; ++i)
            {
                Console.Write("{0}{1}", collection[i].ToString(), delimiter);
            }
            Console.WriteLine();
        }
    }

    internal class Foo
    {
        override public string ToString()
        {
            return "FooClass";
        }
    }

    internal class Program
    {

        static void Main(string[] args)
        {
            var myIntList = new List<int> {1, 2, 3, 4, 5};
            var myDoubleList = new List<double> {1.1, 2.2, 3.3, 4.4};
            var myDoubleArray = new Double[] {12.3, 12.4, 12.5, 12.6};
            var myFooList = new List<Foo> {new Foo(), new Foo(), new Foo()};
            // Using the standard delimiter /t
            myIntList.WriteToConsole();
            myDoubleList.WriteToConsole();
            myDoubleArray.WriteToConsole();
            myFooList.WriteToConsole();
            // Using our own delimiter ~
            myIntList.WriteToConsole("~");
            Console.Read();
        }
    }
}

================================ =======================

Вы могли подумать, что это должен быть конец ответа. Однако можно сделать еще одно обобщение. Из вопроса fatcat не ясно, всегда ли он пишет в консоль. Возможно, в foreach нужно сделать что-то еще. В этом случае ответ Джейсона Бантинга даст эту общность. И снова его ответ:

list.ForEach(i => Console.Write("{0}\t", i));

То есть, если мы не сделаем еще одно уточнение наших методов расширения и не добавим FastForEach, как показано ниже:

public static void FastForEach<T>(this IList<T> collection, Action<T> actionToPerform)
    {
        int count = collection.Count();
        for (int i = 0; i < count; ++i)
        {
            actionToPerform(collection[i]);    
        }
        Console.WriteLine();
    }

Это позволяет нам выполнять любой произвольный код для каждого элемента в коллекции , используя самый быстрый из возможных методов итераций .

Мы даже можем изменить функцию WriteToConsole для использования FastForEach

public static void WriteToConsole<T>(this IList<T> collection, string delimiter)
{
     collection.FastForEach(item => Console.Write("{0}{1}", item.ToString(), delimiter));
}

Итак, теперь весь исходный код, включая пример использования FastForEach, выглядит следующим образом:

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

namespace ConsoleWritelineTest
{
    public static class Extensions
    {
        public static void WriteToConsole<T>(this IList<T> collection)
        {
            WriteToConsole<T>(collection, "\t");
        }

        public static void WriteToConsole<T>(this IList<T> collection, string delimiter)
        {
             collection.FastForEach(item => Console.Write("{0}{1}", item.ToString(), delimiter));
        }

        public static void FastForEach<T>(this IList<T> collection, Action<T> actionToPerform)
        {
            int count = collection.Count();
            for (int i = 0; i < count; ++i)
            {
                actionToPerform(collection[i]);    
            }
            Console.WriteLine();
        }
    }

    internal class Foo
    {
        override public string ToString()
        {
            return "FooClass";
        }
    }

    internal class Program
    {

        static void Main(string[] args)
        {
            var myIntList = new List<int> {1, 2, 3, 4, 5};
            var myDoubleList = new List<double> {1.1, 2.2, 3.3, 4.4};
            var myDoubleArray = new Double[] {12.3, 12.4, 12.5, 12.6};
            var myFooList = new List<Foo> {new Foo(), new Foo(), new Foo()};

            // Using the standard delimiter /t
            myIntList.WriteToConsole();
            myDoubleList.WriteToConsole();
            myDoubleArray.WriteToConsole();
            myFooList.WriteToConsole();

            // Using our own delimiter ~
            myIntList.WriteToConsole("~");

            // What if we want to write them to separate lines?
            myIntList.FastForEach(item => Console.WriteLine(item.ToString()));
            Console.Read();
        }
    }
}
4
ответ дан 27 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: