配列のすべての内容をC#で出力する


95

配列を変更するいくつかのメソッドを呼び出した後、配列の内容を出力しようとしています。Javaでは次を使用します。

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

C#でこれを行うにはどうすればよいですか?

回答:


175

あなたはこれを試すことができます:

foreach(var item in yourArray)
{
    Console.WriteLine(item.ToString());
}

また、次のようなものを試してみることもできます。

yourArray.ToList().ForEach(i => Console.WriteLine(i.ToString()));

編集: [コメントに基づいて] 1行で出力を取得するには:

 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は必要ないことに注意してください。
エレンErsönmez

私はalg.Id.ToList()。ForEach(Console.WriteLine)を使用しましたが、これはうまくいきました。[
8、1、8、8、4、8、6、8、8、8

@ErenErsönmezはい。あなたが正しいです。しかし、アイテムが独自のToStringメカニズムを持つカスタムクラスだった場合はどうでしょうか。
Hossein Narimani Rad 2013

1
上のForEachアプローチの使用:expected.ToList().ForEach(Console.WriteLine);あなたは新しい無用の匿名メソッドを作成しますラムダのではなく、メソッドリファレンスを使用することができます。
ミゲルガンボア2016年

メソッドToListを使用するだけでリストを作成するForEachことは、私見の恐ろしい習慣です。
juharr

60

それを行うには多くの方法がありますが、他の答えは良いです、ここに代替案があります:

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

log:egへの書き込みに適しているのでこれが好きです。
テオ

ロギングによく合うので、私もこれが好きです。また、配列要素がオブジェクトの1つである場合は、をオーバーライドして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

作業中にダウンタイムが発生したため、ここに掲載されているさまざまな方法の速度をテストすることにしました。

これらは私が使用した4つの方法です。

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です。これは、配列の出力速度の主なボトルネックと思われる呼び出しが1つしかないためです。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)これは、2回の反復を必要とし、内部で2番目の配列を作成するのと比較して1回の反復のみを必要としますList(2回の反復ランタイムと2回のメモリ消費)


1
私はあなたの方法が一番好きです、それは私のテストによると2番目に速いですが、それは最も速い方法よりも用途が広いです(私の意見では)。
TJWolschon18年

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.";
    }
}

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に慣れており、デバッグに役立つprintステートメントを挿入しているので、これは私にとって良いことです。ありがとう
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

配列関数を使用したくない場合。

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();
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.