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

74

我有一个包含所有数据库名称的List。我需要在控制台中显示该列表中包含的项(使用Console.WriteLine())。我该如何实现此目标?

7个回答

100
实际上,你可以非常简单地实现它,因为列表有一个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))。


3
为了十分严谨(我不是在建议更改你的答案,只是出于兴趣评论),"Console.WriteLine" 是一个方法组。编译器会使用从方法组到 Action<int> 的隐式转换,选择最具体的方法(在这种情况下是 Console.WriteLine(int))。 - Jon Skeet
是的,就像我说的,“如果我的措辞正确”的话 :p 更新答案(如果我再次搞错了,请告诉我!) - Svish
但是如何使用这种方法打印一个二维列表呢? - Spero

51

虽然使用 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)代替。如果values的任何成员为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


1
如果你想把列表的元素放到另一个字符串中,这非常有用,例如: Console.WriteLine($"我可以在这里写 {String.Join(", ", list)} 和这里"); - Icaro Mota

35
假设这些项已适当地重写了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作为方法组的使用。这比使用lambda表达式更简洁,实际上稍微更有效率(因为委托将只是调用Console.WriteLine,而不是调用一个方法,该方法再调用Console.WriteLine)。

如何在复杂对象类型(例如包含仅字符串属性的Person列表)中使用此功能。 - Koder101
@Koder101:你可能想要在Person类中重写ToString方法。 - Jon Skeet

22

你也可以使用List的内置foreach,例如:

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

这段代码运行速度也显著地更快!

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

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

“显著”更快?这听起来对我来说非常不可能,因为瓶颈将是控制台输出而不是循环。 - Jon Skeet
1
哈哈,我可以把那个词去掉。这只是因为List<T>.ForEach更快,因为它每次迭代只有一个方法调用,而标准的foreach则有2个callvirt IL指令调用。 - CasperT
是的 - 这确实更有效率,只是没有显著的差别。始终要记住瓶颈在哪里 :) 顺便说一下,您可以使用Console.Write作为方法组使第一个版本更加高效...(您无法对第二个执行此操作,因为您实际上正在操作参数。) - Jon Skeet
嘿,是的,那是一个公正的说法。我放弃我的 :) - CasperT

18
Console.WriteLine(string.Join<TYPE>("\n", someObjectList));

2
这对我来说效果最好,因为我可以在将字符串发送到控制台之前准备好它,而不是每次向控制台发送一行。 - Mart10

0
假设我们需要在命令提示符中查看来自数据库表的一些数据。首先,我们创建一个列表。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);
                        }

0
我发现这更容易理解:
List<string> names = new List<string> { "One", "Two", "Three", "Four", "Five" };
        for (int i = 0; i < names.Count; i++)
        {
            Console.WriteLine(names[i]);
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接