Как отобразить элементы списка в окне консоли в C # - PullRequest
34 голосов
/ 17 апреля 2009

У меня есть List, который содержит все имена баз данных. Я должен отобразить элементы, содержащиеся в этом списке в консоли (используя Console.WriteLine()). Как мне этого добиться?

Ответы [ 7 ]

50 голосов
/ 17 апреля 2009

На самом деле вы можете сделать это довольно просто, поскольку в списке есть метод ForEach и вы можете передать Console.WriteLine в качестве группы методов. Затем компилятор будет использовать неявное преобразование для преобразования группы методов в, в данном случае, Action<int> и выбрать наиболее конкретный метод из группы, в данном случае Console.WriteLine(int):

  var list = new List<int>(Enumerable.Range(0, 50));

  list.ForEach(Console.WriteLine);

Работает и со строками =)

Чтобы быть крайне педантичным (и я не предлагаю изменить ваш ответ - просто комментировать ради интереса) Console.WriteLine - это группа методов. Затем компилятор использует неявное преобразование из группы методов в Action<int>, выбирая наиболее конкретный метод (в данном случае Console.WriteLine(int)).

23 голосов
/ 17 апреля 2009

При условии, что элементы переопределяют ToString соответственно:

public void WriteToConsole(IEnumerable items)
{
    foreach (object o in items)
    {
        Console.WriteLine(o);
    }
}

(Не было бы никакого преимущества в использовании обобщений в этом цикле - мы все равно в конечном итоге бы вызвали Console.WriteLine(object), поэтому он все равно будет работать так же, как и в части foreach в этом случае.)

РЕДАКТИРОВАТЬ: ответы с использованием List<T>.ForEach очень хорошо.

Мой цикл выше более гибок в случае, когда у вас есть произвольная последовательность (например, в результате выражения LINQ), но если у вас определенно есть List<T>, я бы сказал, что List<T>.ForEach - лучший вариант .

Одним из преимуществ List<T>.ForEach является то, что если у вас есть конкретный тип списка, он будет использовать наиболее подходящую перегрузку. Например:

List<int> integers = new List<int> { 1, 2, 3 };
List<string> strings = new List<string> { "a", "b", "c" };

integers.ForEach(Console.WriteLine);
strings.ForEach(Console.WriteLine);

При записи целых чисел будет использоваться Console.WriteLine(int), тогда как при записи строк будет использоваться Console.WriteLine(string). Если конкретная перегрузка недоступна (или если вы просто используете универсальный List<T>, а компилятор не знает, что такое T), он будет использовать Console.WriteLine(object).

Кстати, обратите внимание на использование Console.WriteLine в качестве группы методов. Это более сжато, чем использование лямбда-выражения, и на самом деле немного более эффективно (поскольку делегат будет просто быть вызовом Console.WriteLine, а не вызовом метода, который в включай просто звонки Console.WriteLine).

17 голосов
/ 14 апреля 2016

Хотя ответы с List<T>.ForEach очень хорошие.

Я нашел String.Join<T>(string separator, IEnumerable<T> values) метод более полезным.

Пример:

List<string> numbersStrLst = new List<string>
            { "One", "Two", "Three","Four","Five"};

Console.WriteLine(String.Join(", ", numbersStrLst));//Output:"One, Two, Three, Four, Five"

int[] numbersIntAry = new int[] {1, 2, 3, 4, 5};
Console.WriteLine(String.Join("; ", numbersIntAry));//Output:"1; 2; 3; 4; 5"

Примечания:

Если разделитель равен null , вместо него используется пустая строка (String.Empty). Если какой-либо элемент значений равен null , вместо него используется пустая строка.

Join(String, IEnumerable<String>) - это удобный метод, который позволяет объединять каждый элемент в коллекции IEnumerable (Of String) без предварительного преобразования элементов в массив строк. Это особенно полезно для выражений запросов LINQ.

Это должно нормально работать для проблемы, тогда как для других, имеющих значения массива. Используйте другие перегрузки этого же метода, String.Join Method (String, Object [])

Ссылка: https://msdn.microsoft.com/en-us/library/dd783876(v=vs.110).aspx

14 голосов
/ 17 апреля 2009

Вы также можете использовать встроенный foreach List, например:

List<T>.ForEach(item => Console.Write(item));

Этот код также работает значительно быстрее!

Приведенный выше код также позволяет вам манипулировать Console.WriteLine, например:

List<T>.ForEach(item => Console.Write(item + ",")); //Put a,b etc.
7 голосов
/ 17 апреля 2013
Console.WriteLine(string.Join<TYPE>("\n", someObjectList));
1 голос
/ 13 апреля 2017

Мне было легче понять:

List<string> names = new List<string> { "One", "Two", "Three", "Four", "Five" };
        for (int i = 0; i < names.Count; i++)
        {
            Console.WriteLine(names[i]);
        }
0 голосов
/ 01 августа 2018

Предположим, что нам нужно просмотреть некоторые данные в командной строке, которые поступают из таблицы базы данных. Сначала мы создаем список. Team_Details - это мой класс недвижимости.

    List<Team_Details> teamDetails = new List<Team_Details>();

Затем вы можете подключиться к базе данных, выполнить поиск данных и сохранить их в списке следующим образом.

            string connetionString = "Data Source=.;Initial Catalog=your DB name;Integrated Security=True;MultipleActiveResultSets=True";
            using (SqlConnection conn = new SqlConnection(connetionString)){
            string getTeamDetailsQuery = "select * from Team";
            conn.Open();
            using (SqlCommand cmd = new SqlCommand(getTeamDetailsQuery, conn))
                    {
                        SqlDataReader rdr = cmd.ExecuteReader();
                    {
                        teamDetails.Add(new Team_Details
                        {
                            Team_Name = rdr.GetString(rdr.GetOrdinal("Team_Name")),
                            Team_Lead = rdr.GetString(rdr.GetOrdinal("Team_Lead")),
                        });
                    }

Затем вы можете распечатать этот список в командной строке следующим образом.

foreach (Team_Details i in teamDetails)
                        {
                            Console.WriteLine(i.Team_Name);
                            Console.WriteLine(i.Team_Lead);
                        }
...