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


95

我尝试在使用一些更改数组的方法后将其内容打印出来,在Java中,我使用以下方法:

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

我该如何在C#中做到这一点?

Answers:


175

您可以尝试以下方法:

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
注意,.ToString不是必需的,因为WriteLine有各种重载,包括使用Object的后备重载。
ErenErsönmez13年

我使用了alg.Id.ToList()。ForEach(Console.WriteLine),效果很好,谢谢。是否可以像下面这样实际打印:[
Padraic Cunningham

@ErenErsönmez是的。你是对的。但是,如果项目是具有自己ToString机制的自定义类,该怎么办?
Hossein Narimani Rad

1
关于ForEach方法的使用:expected.ToList().ForEach(Console.WriteLine);您可以使用方法引用而不是lambda来创建新的无用匿名方法。
Miguel Gamboa'3

创建ToList仅使用该ForEach方法的列表是恕我直言的可怕做法。
juharr

60

有很多方法可以做到,其他答案很好,这是一个替代方案:

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

我之所以喜欢这样,是因为它非常适合写日志:例如,myArrayObjects是_validExtensions:Write2Log(“开始使用blabla扩展名:” + string.Join(“-”,_validImgExtensions)+“依此类推”);
张志贤

我也喜欢它,因为它非常适合日志记录。而且,如果array元素是您的对象之一,则可以覆盖ToString()和在那里处理格式。var a = new [] { "Admin", "Peon" };_log.LogDebug($"Supplied roles are '{string.Join(", ", a)}'.");
亚伦

16

最简单的例子,例如,如果您有一个声明为这样的字符串数组string [] myStringArray = new string [];

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

10

由于工作中有一些停机时间,我决定测试此处发布的各种方法的速度。

这是我使用的四种方法。

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

因此Print3是最快的,因为它只有一个调用 Console.WriteLine这似乎是打印阵列速度的主要瓶颈。Print4比Print2快一点,而Print1是其中最慢的。

我认为,即使Print3速度更快,Print4可能是我测试的4种打印机中功能最丰富的。

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

编辑:我在下面添加生成的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   

8

Array.ForEach<T> Method (T[], Action<T>)方法的另一种方法Array

Array.ForEach(myArray, Console.WriteLine);

相较于array.ToList().ForEach(Console.WriteLine)进行两次迭代并在内部创建第二个数组List(两次迭代运行时和双重内存消耗),这仅需一次迭代


1
我最喜欢您的方法,根据我的测试,它是第二快的方法,但是比最快的方法(我认为)更通用。
TJ Wolschon '18年

2

在C#中,您可以遍历数组,打印每个元素。请注意,System.Object定义了方法ToString()。从System.Object()派生的任何给定类型都可以覆盖它。

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

http://msdn.microsoft.com/zh-CN/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.";
    }
}

1

从开始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

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

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

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

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

如果是字符串数组,则可以使用Aggregate

var array = new string[] { "A", "B", "C", "D"};
Console.WriteLine(array.Aggregate((result, next) => $"{result}, {next}")); // A, B, C, D

这样,您可以通过更改参数的顺序来颠倒顺序,如下所示

Console.WriteLine(array.Aggregate((result, next) => $"{next}, {result}")); // D, C, B, A

0

您可以使用for循环

    int[] random_numbers = {10, 30, 44, 21, 51, 21, 61, 24, 14}
    int array_length = random_numbers.Length;
    for (int i = 0; i < array_length; i++){
        if(i == array_length - 1){
              Console.Write($"{random_numbers[i]}\n");
        } else{
              Console.Write($"{random_numbers[i]}, ");
         }
     }

-2

如果您不想使用Array函数。

public class GArray
{
    int[] mainArray;
    int index;
    int i = 0;

    public GArray()
    {
        index = 0;
        mainArray = new int[4];
    }
    public void add(int addValue)
    {

        if (index == mainArray.Length)
        {
            int newSize = index * 2;
            int[] temp = new int[newSize];
            for (int i = 0; i < mainArray.Length; i++)
            {
                temp[i] = mainArray[i];
            }
            mainArray = temp;
        }
        mainArray[index] = addValue;
        index++;

    }
    public void print()
    {
        for (int i = 0; i < index; i++)
        {
            Console.WriteLine(mainArray[i]);
        }
    }
 }
 class Program
{
    static void Main(string[] args)
    {
        GArray myArray = new GArray();
        myArray.add(1);
        myArray.add(2);
        myArray.add(3);
        myArray.add(4);
        myArray.add(5);
        myArray.add(6);
        myArray.print();
        Console.ReadKey();
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.