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 #?
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:
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 ToList
bước này.
Array.ForEach(yourArray, Console.WriteLine);
ToString
cơ chế riêng của nó .
ForEach
sử 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.
ToList
chỉ để sử dụng ForEach
phương pháp này là một IMHO thực hành khủng khiếp.
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));
ToString()
và xử lý định dạng ở đó. var a = new [] { "Admin", "Peon" };_log.LogDebug($"Supplied roles are '{string.Join(", ", a)}'.");
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.WriteLine
mà 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
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 Array
lớ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)
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.";
}
}
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
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.)
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.
đâ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();
}
}
}
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
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]}, ");
}
}
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();
}
}