在C#中打印数组的所有内容

169

我试图在Java中使用以下代码,在调用一些修改数组的方法后打印出数组的内容:

System.out.print(Arrays.toString(alg.id));

我该如何在C#中实现这个?


请仔细查看以下相关内容:https://dev59.com/62LVa4cB1Zd3GeqPwnzo - Peter Duniho
1
a) 使用 F# (printfn "%A\n" [| 1, 2, 3 |]) 或 b) 使用 Common Lisp ((let ((arr #(1 2 3))) (print arr)))。在使用其他语言多年后编写了一些 C# 的 SO 答案之后,我无法相信结构体和数组的通用输出仍然不是 C# 的一部分。 - BitTickler
13个回答

297
你可以试试这个方法:
foreach(var item in yourArray)
{
    Console.WriteLine(item.ToString());
}

您可能想尝试类似以下的方法:
yourArray.ToList().ForEach(i => Console.WriteLine(i.ToString()));

编辑:根据您的评论,为了获得单行输出:

 Console.WriteLine("[{0}]", string.Join(", ", yourArray));
 //output style:  [8, 1, 8, 8, 4, 8, 6, 8, 8, 8]

编辑(2019年):正如其他答案中提到的那样,最好使用Array.ForEach<T>方法,无需执行ToList步骤。

Array.ForEach(yourArray, Console.WriteLine);

3
请注意,由于WriteLine具有包括一个接受对象的回退方法在内的各种重载,因此不需要使用.ToString。 - Eren Ersönmez
1
我使用 alg.Id.ToList().ForEach(Console.WriteLine) 成功了,谢谢。是否有可能真正像这样打印出来:[8, 1, 8, 8, 4, 8, 6, 8, 8, 8]? - Padraic Cunningham
1
在使用ForEach方法时,请使用以下代码:expected.ToList().ForEach(Console.WriteLine); 您可以使用方法引用而不是创建一个新的无用匿名方法。 - Miguel Gamboa
1
在我看来,仅仅为了使用ForEach方法而使用ToList创建列表是一种可怕的做法。 - juharr
3
无论如何,您不需要将我的答案复制粘贴到您的答案中。 - fubo
显示剩余2条评论

93

有很多方法可以做到这一点,其他回答也不错,这里提供一个替代方案:

Console.WriteLine(string.Join("\n", myArrayOfObjects));

我喜欢这个程序,因为它很适合我在写日志时使用,例如:myArrayObjects是_validExtensions: Write2Log("开始blabla并使用扩展名:" + string.Join("-", _validImgExtensions) + "等等"); - Teo
我也喜欢这个,因为它很适合记录;如果数组元素是您的对象之一,则可以重写 ToString() 并在其中处理格式。 var a = new [] { "Admin", "Peon" };_log.LogDebug($"提供的角色为 '{string.Join(", ", a)}'."); - Aaron

29

最简单的方法是,例如,如果您声明了一个字符串数组,像这样string [] myStringArray = new string[];

Console.WriteLine("Array : ");
Console.WriteLine("[{0}]", string.Join(", ", myStringArray));

26

我决定测试这里发布的不同方法的速度:

这是我使用的四种方法。

static void Print1(string[] toPrint)
{
    foreach(string s in toPrint)
    {
        Console.Write(s);
    }
}

static void Print2(string[] toPrint)
{
    toPrint.ToList().ForEach(Console.Write);
}

static void Print3(string[] toPrint)
{
    Console.WriteLine(string.Join("", toPrint));
}

static void Print4(string[] toPrint)
{
    Array.ForEach(toPrint, Console.Write);
}

结果如下:

 Strings per trial: 10000
 Number of Trials: 100
 Total Time Taken to complete: 00:01:20.5004836
 Print1 Average: 484.37ms
 Print2 Average: 246.29ms
 Print3 Average: 70.57ms
 Print4 Average: 233.81ms

因为只调用了一次Console.WriteLine,所以Print3是最快的,这似乎是打印数组速度的主要瓶颈。Print4比Print2稍快,而Print1是所有方法中最慢的。

我认为在我测试的4个方法中,尽管Print3更快,但Print4可能是最通用的。

如果我有任何错误,请随时让我知道/自行修正!

编辑:我在下面添加了生成的IL。

g__Print10_0://Print1
IL_0000:  ldarg.0     
IL_0001:  stloc.0     
IL_0002:  ldc.i4.0    
IL_0003:  stloc.1     
IL_0004:  br.s        IL_0012
IL_0006:  ldloc.0     
IL_0007:  ldloc.1     
IL_0008:  ldelem.ref  
IL_0009:  call        System.Console.Write
IL_000E:  ldloc.1     
IL_000F:  ldc.i4.1    
IL_0010:  add         
IL_0011:  stloc.1     
IL_0012:  ldloc.1     
IL_0013:  ldloc.0     
IL_0014:  ldlen       
IL_0015:  conv.i4     
IL_0016:  blt.s       IL_0006
IL_0018:  ret         

g__Print20_1://Print2
IL_0000:  ldarg.0     
IL_0001:  call        System.Linq.Enumerable.ToList<String>
IL_0006:  ldnull      
IL_0007:  ldftn       System.Console.Write
IL_000D:  newobj      System.Action<System.String>..ctor
IL_0012:  callvirt    System.Collections.Generic.List<System.String>.ForEach
IL_0017:  ret         

g__Print30_2://Print3
IL_0000:  ldstr       ""
IL_0005:  ldarg.0     
IL_0006:  call        System.String.Join
IL_000B:  call        System.Console.WriteLine
IL_0010:  ret         

g__Print40_3://Print4
IL_0000:  ldarg.0     
IL_0001:  ldnull      
IL_0002:  ldftn       System.Console.Write
IL_0008:  newobj      System.Action<System.String>..ctor
IL_000D:  call        System.Array.ForEach<String>
IL_0012:  ret   

10

使用Array.ForEach<T>方法(T[], Action<T>)可以实现另一种方法,该方法属于Array类。

Array.ForEach(myArray, Console.WriteLine);

相比于使用array.ToList().ForEach(Console.WriteLine)需要两次迭代和在List内部创建第二个数组(运行时间和内存消耗翻倍),只需进行一次迭代即可。


1
我最喜欢你的方法,根据我的测试它是第二快的,但比最快的方法更灵活(在我看来)。 - Daxtron2

7

C# 6.0 开始,引入了$ - 字符串插值的方法,现在有一种新的方式:

var array = new[] { "A", "B", "C" };
Console.WriteLine($"{string.Join(", ", array)}");

//output
A, B, C

使用 System.Linq,可以将字符串数组 string[] 转换为字符数组 char[] 并以 string 形式进行拼接:

var array = new[] { "A", "B", "C" };
Console.WriteLine($"{new String(array.SelectMany(_ => _).ToArray())}");

//output
ABC

1
而且不使用字符串插值:Console.WriteLine(String.Join(", ", array)); - undefined

2
在C#中,您可以循环遍历数组并打印每个元素。请注意,System.Object定义了一个名为ToString()的方法。任何从System.Object()继承的类型都可以重写它。

返回表示当前对象的字符串。

http://msdn.microsoft.com/en-us/library/system.object.tostring.aspx

默认情况下,对象的完整类型名称将被打印出来,尽管许多内置类型会覆盖此默认行为以打印更有意义的结果。您可以在自己的对象中重写 ToString() 方法以提供有意义的输出。
foreach (var item in myArray)
{
    Console.WriteLine(item.ToString()); // Assumes a console application
}

如果你有自己的Foo类,你可以像这样覆盖ToString()方法:
public class Foo
{
    public override string ToString()
    {
        return "This is a formatted specific for the class Foo.";
    }
}

0

这是使用数组打印字符串的最简单方法!!!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace arraypracticeforstring
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] arr = new string[3] { "Snehal", "Janki", "Thakkar" };

            foreach (string item in arr)
            {
                Console.WriteLine(item.ToString());
            }
            Console.ReadLine();
        }
    }
}

0

我给Matthew Watson的扩展方法答案点了赞,但如果你从Python迁移/访问,你可能会发现这样的方法很有用:

class Utils
{
    static void dump<T>(IEnumerable<T> list, string glue="\n")
    {
        Console.WriteLine(string.Join(glue, list.Select(x => x.ToString())));
    }
}

-> 这将使用提供的分隔符打印任何集合。它非常有限(嵌套集合?)。

对于一个脚本(即一个只包含 Program.cs 的 C# 控制台应用程序,并且大多数操作发生在 Program.Main 中) - 这可能就足够了。


0
如果你想要变得聪明,你可以编写一个扩展方法,将 IEnumerable<object> 序列写入控制台。这将适用于任何类型的可枚举对象,因为 IEnumerable<T> 在 T 上是协变的。
using System;
using System.Collections.Generic;

namespace Demo
{
    internal static class Program
    {
        private static void Main(string[] args)
        {
            string[] array  = new []{"One", "Two", "Three", "Four"};
            array.Print();

            Console.WriteLine();

            object[] objArray = new object[] {"One", 2, 3.3, TimeSpan.FromDays(4), '5', 6.6f, 7.7m};
            objArray.Print();
        }
    }

    public static class MyEnumerableExt
    {
        public static void Print(this IEnumerable<object> @this)
        {
            foreach (var obj in @this)
                Console.WriteLine(obj);
        }
    }
}

我认为您除了测试代码之外不会使用它。


我花了一段时间才完全明白,但这非常方便。我习惯于使用Python并插入打印语句来帮助调试,所以这对我很有帮助。谢谢。 - Padraic Cunningham

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