如何在C#中的控制台窗口上显示列表项

40 c# console-application

我有一个List包含所有数据库名称.我必须在控制台(使用Console.WriteLine())中显示该列表中包含的项目.我怎样才能做到这一点?

Svi*_*ish 54

实际上你可以很简单,因为列表有一个ForEach方法,因为你可以Console.WriteLine作为方法组传入.然后,编译器将使用隐式转换将方法组转换为(在本例中为a)Action<int>并从组中选择最具体的方法,在本例中为"Console.WriteLine(int)":

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

  list.ForEach(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)

也适用于字符串=)

完全迂腐(我并不是建议改变你的答案 - 只是为了感兴趣而评论)"Console.WriteLine"是一个方法组.然后,编译器使用从方法组到Action的隐式转换,选择最具体的方法(在本例中为Console.WriteLine(int)).

  • 完全迂腐(我并不是建议改变你的答案 - 只是为了感兴趣而评论)"Console.WriteLine"是一个方法组.然后,编译器使用从方法组到Action <int>的隐式转换,选择最具体的方法(在本例中为Console.WriteLine(int)). (2认同)

Jon*_*eet 24

假设项目ToString适当地覆盖:

public void WriteToConsole(IEnumerable items)
{
    foreach (object o in items)
    {
        Console.WriteLine(o);
    }
}
Run Code Online (Sandbox Code Playgroud)

(在这个循环中使用泛型没有任何优势 - 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);
Run Code Online (Sandbox Code Playgroud)

当写出整数时,这将使用Console.WriteLine(int),而当写出它将使用的字符串时Console.WriteLine(string).如果没有可用的特定重载(或者如果您只是使用泛型List<T>,并且编译器不知道T它是什么),它将使用Console.WriteLine(object).

Console.WriteLine顺便提一下,请注意使用方法组.这比使用lambda表达式更简洁,实际上效率稍高(因为委托只是一个调用Console.WriteLine,而不是调用一个方法,而这个方法只是调用Console.WriteLine).


Bhr*_*mar 19

虽然答案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"
Run Code Online (Sandbox Code Playgroud)

备注:

如果separator为null,则使用空字符串(String.Empty).如果value的任何成员为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


Cas*_*erT 15

您还可以使用List的内置foreach,例如:

List<T>.ForEach(item => Console.Write(item));
Run Code Online (Sandbox Code Playgroud)

此代码还运行显著更快!

上面的代码还使您能够操作Console.WriteLine,例如:

List<T>.ForEach(item => Console.Write(item + ",")); //Put a,b etc.
Run Code Online (Sandbox Code Playgroud)


Bla*_*fee 11

Console.WriteLine(string.Join<TYPE>("\n", someObjectList));
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说效果最好,因为我可以在将字符串发送到控制台之前准备好字符串,而不是每次都将一行发送到控制台 (2认同)