68

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

4

7 回答 7

93

实际上你可以很简单地做到这一点,因为列表有一个方法,而且你可以作为一个方法组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)在这种情况下)。

于 2009-04-17T06:17:14.407 回答
44

虽然答案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"

评论 :

如果 separator 为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

于 2016-04-14T05:08:36.770 回答
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)。

于 2009-04-17T05:29:00.153 回答
21

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

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

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

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

List<T>.ForEach(item => Console.Write(item + ",")); //Put a,b etc.
于 2009-04-17T06:11:56.637 回答
17
Console.WriteLine(string.Join<TYPE>("\n", someObjectList));
于 2013-04-17T13:44:16.447 回答
1

我发现这更容易理解:

List<string> names = new List<string> { "One", "Two", "Three", "Four", "Five" };
        for (int i = 0; i < names.Count; i++)
        {
            Console.WriteLine(names[i]);
        }
于 2017-04-13T12:15:47.143 回答
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);
                        }
于 2018-08-01T06:44:41.097 回答