【问题标题】:How to display list items on console window in C#如何在 C# 中的控制台窗口上显示列表项
【发布时间】:2010-10-20 00:53:06
【问题描述】:

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

【问题讨论】:

    标签: c# console-application


    【解决方案1】:

    实际上你可以很简单地做到这一点,因为列表有一个ForEach 方法,而且你可以将Console.WriteLine 作为一个方法组传入。然后编译器将使用隐式转换将方法组转换为Action<int>,并从组中选择最具体的方法,在这种情况下为Console.WriteLine(int)

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

    也适用于字符串 =)

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

    【讨论】:

    • 完全迂腐(我并不是建议您更改答案-只是为了感兴趣而发表评论)“Console.WriteLine”是一个方法组。然后编译器使用从方法组到 Action 的隐式转换,选择最具体的方法(在本例中为 Console.WriteLine(int))。
    • 是的,就像我说的,“如果我的措辞正确的话”:p 更新答案(如果我又弄错了,请告诉我!)
    • 但是如何使用这种方法打印二维列表呢?
    【解决方案2】:

    虽然List&lt;T&gt;.ForEach 的答案非常好。

    我发现String.Join&lt;T&gt;(string separator, IEnumerable&lt;T&gt; 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&lt;String&gt;) 是一种方便的方法,可让您连接 IEnumerable(Of String) 集合中的每个元素,而无需先将元素转换为字符串数组。它对语言集成查询 (LINQ) 查询表达式特别有用。

    这应该可以很好地解决问题,而对于其他人来说,具有数组值。使用相同方法的其他重载,String.Join Method (String, Object[])

    参考:https://msdn.microsoft.com/en-us/library/dd783876(v=vs.110).aspx

    【讨论】:

    • 如果您想将列表的元素放在另一个字符串中,这非常有用,例如: Console.WriteLine($"i can write here {String.Join(", ", list)} 和这里");
    【解决方案3】:

    假设项目适当地覆盖ToString

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

    (在这个循环中使用泛型没有任何优势——无论如何我们最终都会调用Console.WriteLine(object),所以它仍然会像在这种情况下的foreach 部分一样装箱。)

    编辑:使用List&lt;T&gt;.ForEach 的答案非常好。

    如果您有任意序列(例如作为 LINQ 表达式的结果),我上面的循环更加灵活,但如果您肯定有 List&lt;T&gt; 我会说 List&lt;T&gt;.ForEach 是更好的选择.

    List&lt;T&gt;.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&lt;T&gt; 而编译器不知道T 是什么),它将使用Console.WriteLine(object)

    顺便说一下,注意Console.WriteLine 作为方法组的使用。这比使用 lambda 表达式更简洁,实际上稍微更有效(因为委托将只是调用Console.WriteLine,而不是调用方法这反过来只是调用Console.WriteLine)。

    【讨论】:

    • 如何将其用于复杂对象类型,例如 List 其中 Person 仅包含字符串属性。
    • @Koder101:您可能希望在 Person 中覆盖 ToString
    【解决方案4】:

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

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

    此代码的运行速度也明显更快!

    上面的代码也让你可以操作Console.WriteLine,比如这样做:

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

    【讨论】:

    • 明显更快?这听起来不太可能,因为瓶颈将是控制台输出而不是循环。
    • 哈哈我可以把这个词说出来。这只是因为 List.ForEach 更快,因为它每次迭代只有一个方法调用,而标准 foreach 有 2 个 callvirt IL 指令调用
    • 是的 - 它肯定更有效,只是不是很显着。始终值得牢记瓶颈的真正所在:)您可以使用 Console.Write 作为方法组来提高第一个版本的效率,顺便说一句...(您不能使用第二个版本,因为您是实际操作参数。)
    • 嘿,是的,这是一个公平的说法。我没收了我的:)
    【解决方案5】:
    Console.WriteLine(string.Join<TYPE>("\n", someObjectList));
    

    【讨论】:

    • 这对我来说效果最好,因为我可以在将字符串发送到控制台之前准备好字符串,而不是每次都向控制台发送一行
    【解决方案6】:

    我发现这更容易理解:

    List<string> names = new List<string> { "One", "Two", "Three", "Four", "Five" };
            for (int i = 0; i < names.Count; i++)
            {
                Console.WriteLine(names[i]);
            }
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多