друк всього вмісту масиву на C #


96

Я намагаюся роздрукувати вміст масиву після виклику деяких методів, які його змінюють, в Java я використовую:

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

як це зробити в c #?

Відповіді:


177

Ви можете спробувати це:

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

Також ви можете спробувати щось подібне:

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

EDIT: щоб отримати вихід в один рядок [на основі вашого коментаря]:

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

EDIT (2019): Як зазначається в інших відповідях, краще використовувати Array.ForEach<T>метод, і немає потреби робити ToListкрок.

Array.ForEach(yourArray, Console.WriteLine);

3
Зверніть увагу, що .ToString не є необхідним, оскільки WriteLine має різні перевантаження, включаючи резервний, який приймає об'єкт.
Eren Ersönmez

Я використовував alg.Id.ToList (). ForEach (Console.WriteLine), який добре працював, дякую. Чи можна насправді надрукувати його так: [8, 1, 8, 8, 4, 8, 6, 8, 8, 8]
Падраїк Каннінгем,

@ ErenErsönmez Так. Ти правий. але що, якби елемент був спеціальним класом зі своїм ToStringмеханізмом.
Hossein Narimani Rad

1
Про ForEachвикористання підходу: expected.ToList().ForEach(Console.WriteLine);Ви можете використовувати посилання на метод замість лямбда, що створить новий марний анонімний метод.
Мігель Гамбоа

Створення списку ToListлише для використання ForEachметоду - жахлива практика IMHO.
juharr

60

Є багато способів це зробити, інші відповіді хороші, ось альтернатива:

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

Мені це подобається, тому що мені добре підходить для запису в журнал: наприклад, myArrayObjects - це _validExtensions: Write2Log ("Запустити blabla з розширеннями:" + string.Join ("-", _validImgExtensions) + "тощо");
Тео

Мені це теж подобається, оскільки добре підходить для реєстрації; І якщо елемент масиву є одним із ваших об'єктів, ви можете замінити ToString()і обробити там форматування. var a = new [] { "Admin", "Peon" };_log.LogDebug($"Supplied roles are '{string.Join(", ", a)}'.");
Аарон,

16

Найпростіший, наприклад, якщо у вас є масив рядків, оголошений як цей рядок [] myStringArray = новий рядок [];

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 - найповільніший з усіх.

Я думаю, що Print4, мабуть, є найбільш універсальним з 4-х, які я тестував, хоча Print3 і швидший.

Якщо я допустив помилки, не соромтеся повідомляти / виправляти їх самостійно!

EDIT: Я додаю згенерований 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,

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 і покласти оператори друку , щоб допомогти налагодити , так що це добре для me.thanks
Padraic Cunningham

0

Я підтримав відповідь методу розширення від Метью Ватсона, але якщо ви мігруєте / відвідуєте з-під Python, ви можете знайти такий метод корисним:

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

-> це надрукує будь-яку колекцію з використанням роздільника. Це досить обмежено (вкладені колекції?).

Що стосується сценарію (тобто консольного додатка C #, який містить лише Program.cs, і більшість речей трапляється 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

Ви можете використовувати для циклу

    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();
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.