in tất cả nội dung của mảng trong C #


95

Tôi đang cố gắng in ra nội dung của một mảng sau khi gọi một số phương thức làm thay đổi nó, trong Java, tôi sử dụng:

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

làm cách nào để làm điều này trong c #?

Câu trả lời:


175

Bạn có thể thử điều này:

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

Ngoài ra, bạn có thể muốn thử một cái gì đó như thế này:

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

CHỈNH SỬA: để có đầu ra trong một dòng [dựa trên nhận xét của bạn]:

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

EDIT (2019): Như đã đề cập trong các câu trả lời khác, tốt hơn là sử dụng Array.ForEach<T>phương pháp và không cần thực hiện ToListbước này.

Array.ForEach(yourArray, Console.WriteLine);

3
Lưu ý rằng .ToString là không cần thiết vì WriteLine có nhiều quá tải khác nhau bao gồm một quá tải dự phòng lấy một Đối tượng.
Eren Ersönmez

Tôi đã sử dụng alg.Id.ToList (). ForEach (Console.WriteLine), hoạt động tốt, cảm ơn bạn. Là nó có thể thực sự in nó như sau: [8, 1, 8, 8, 4, 8, 6, 8, 8, 8]
Padraic Cunningham

@ ErenErsönmez Có. Bạn đúng rồi. nhưng điều gì sẽ xảy ra nếu mục đó là một lớp tùy chỉnh với ToStringcơ chế riêng của nó .
Hossein Narimani Rad

1
Khi ForEachsử dụng phương pháp: expected.ToList().ForEach(Console.WriteLine);Bạn có thể sử dụng Tham chiếu phương pháp thay vì lambda sẽ tạo ra một phương thức ẩn danh vô dụng mới.
Miguel Gamboa

Tạo một danh sách ToListchỉ để sử dụng ForEachphương pháp này là một IMHO thực hành khủng khiếp.
juharr

60

Có nhiều cách để làm điều đó, các câu trả lời khác đều tốt, đây là một giải pháp thay thế:

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

Tôi thích điều này vì phù hợp với tôi khi ghi vào nhật ký: ví dụ: myArrayObjects là _validExtensions: Write2Log ("Bắt đầu blabla với các ngoại lệ:" + string.Join ("-", _validImgExtensions) + "và vân vân");
Teo

Tôi cũng thích điều này vì nó rất phù hợp với việc ghi nhật ký; Và nếu phần tử mảng là một trong các đối tượng của bạn, bạn có thể ghi đè ToString()và xử lý định dạng ở đó. var a = new [] { "Admin", "Peon" };_log.LogDebug($"Supplied roles are '{string.Join(", ", a)}'.");
Aaron

16

Đơn giản nhất, ví dụ: nếu bạn có một mảng chuỗi được khai báo như sau string [] myStringArray = new string [];

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

10

Do có một số thời gian chết tại nơi làm việc, tôi quyết định kiểm tra tốc độ của các phương pháp khác nhau được đăng ở đây.

Đây là bốn phương pháp tôi đã sử dụng.

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);
}

Kết quả như sau:

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

Vì vậy, Print3 là nhanh nhất, bởi vì nó chỉ có một lệnh gọi Console.WriteLinemà dường như là nút thắt chính cho tốc độ in ra một mảng. Print4 nhanh hơn một chút so với Print2 và Print1 là chậm nhất trong số đó.

Tôi nghĩ rằng Print4 có lẽ là linh hoạt nhất trong số 4 mà tôi đã thử nghiệm, mặc dù Print3 nhanh hơn.

Nếu tôi mắc phải bất kỳ lỗi nào, vui lòng cho tôi biết / tự sửa chúng!

CHỈNH SỬA: Tôi đang thêm IL được tạo bên dưới

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

Một cách tiếp cận khác với Array.ForEach<T> Method (T[], Action<T>)phương thức của Arraylớp

Array.ForEach(myArray, Console.WriteLine);

Điều đó chỉ mất một lần lặp so với array.ToList().ForEach(Console.WriteLine)lần lặp lại hai lần và tạo ra bên trong một mảng thứ hai cho List(thời gian chạy lặp lại kép và tiêu tốn bộ nhớ gấp đôi)


1
Tôi thích phương pháp của bạn nhất, nó nhanh thứ hai theo thử nghiệm của tôi nhưng nó linh hoạt hơn phương pháp nhanh nhất (theo ý kiến ​​của tôi).
TJ Wolschon

2

Trong C #, bạn có thể lặp qua mảng in từng phần tử. Lưu ý rằng System.Object định nghĩa một phương thức ToString (). Bất kỳ kiểu cụ thể nào dẫn xuất từ ​​System.Object () đều có thể ghi đè kiểu đó.

Trả về một chuỗi đại diện cho các đối tượng hiện tại.

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

Theo mặc định, tên kiểu đầy đủ của đối tượng sẽ được in, mặc dù nhiều kiểu tích hợp sẽ ghi đè mặc định đó để in kết quả có ý nghĩa hơn. Bạn có thể ghi đè ToString () trong các đối tượng của riêng mình để cung cấp đầu ra có ý nghĩa.

foreach (var item in myArray)
{
    Console.WriteLine(item.ToString()); // Assumes a console application
}

Nếu bạn có lớp Foo của riêng mình, bạn có thể ghi đè ToString () như:

public class Foo
{
    public override string ToString()
    {
        return "This is a formatted specific for the class Foo.";
    }
}

1

Bắt đầu từ C # 6.0 , khi nội suy $ - chuỗi đã được giới thiệu, có một cách nữa:

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

//output
A, B, C

Kết nối có thể được lưu trữ bằng cách sử dụng System.Linq, chuyển đổi string[]thành char[]và in dưới dạngstring

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

//output
ABC

0

Nếu bạn muốn trở nên dễ thương, bạn có thể viết một phương thức mở rộng để viết một IEnumerable<object>chuỗi vào bảng điều khiển. Điều này sẽ hoạt động với bất kỳ kiểu liệt kê nào, vì IEnumerable<T>nó đồng biến trên 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);
        }
    }
}

(Tôi không nghĩ rằng bạn sẽ sử dụng điều này ngoài mã thử nghiệm.)


Đã cho tôi một thời gian để hiểu đầy đủ nhưng đó là rất tiện dụng, tôi đã quen với Python và đưa báo cáo in trong để giúp đỡ debug vì vậy đây là tốt cho me.Thanks
Padraic Cunningham

0

Tôi đã ủng hộ câu trả lời phương pháp mở rộng của Matthew Watson, nhưng nếu bạn đang di chuyển / truy cập đến từ Python, bạn có thể thấy một phương pháp như vậy hữu ích:

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

-> điều này sẽ in bất kỳ bộ sưu tập nào bằng cách sử dụng dấu phân tách được cung cấp. Nó khá hạn chế (các bộ sưu tập lồng nhau?).

Đối với một tập lệnh (tức là một ứng dụng bảng điều khiển C # chỉ chứa Program.cs và hầu hết mọi thứ đều xảy ra trong đó Program.Main) - điều này có thể ổn.


0

đây là cách dễ nhất mà bạn có thể in Chuỗi bằng cách sử dụng mảng !!!

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

Nếu đó là một mảng chuỗi, bạn có thể sử dụng Aggregate

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

theo cách đó, bạn có thể đảo ngược thứ tự bằng cách thay đổi thứ tự của các tham số như vậy

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

0

Bạn có thể sử dụng vòng lặp 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

Nếu bạn không muốn sử dụng hàm 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();
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.