我试图在Java中使用以下代码,在调用一些修改数组的方法后打印出数组的内容:
System.out.print(Arrays.toString(alg.id));
我该如何在C#中实现这个?
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);
ForEach
方法时,请使用以下代码:expected.ToList().ForEach(Console.WriteLine);
您可以使用方法引用而不是创建一个新的无用匿名方法。 - Miguel GamboaForEach
方法而使用ToList
创建列表是一种可怕的做法。 - juharr有很多方法可以做到这一点,其他回答也不错,这里提供一个替代方案:
Console.WriteLine(string.Join("\n", myArrayOfObjects));
ToString()
并在其中处理格式。
var a = new [] { "Admin", "Peon" };_log.LogDebug($"提供的角色为 '{string.Join(", ", a)}'.");
- Aaron最简单的方法是,例如,如果您声明了一个字符串数组,像这样string [] myStringArray = new string[];
Console.WriteLine("Array : ");
Console.WriteLine("[{0}]", string.Join(", ", myStringArray));
我决定测试这里发布的不同方法的速度:
这是我使用的四种方法。
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
因为只调用了一次Console.WriteLine
,所以Print3是最快的,这似乎是打印数组速度的主要瓶颈。Print4比Print2稍快,而Print1是所有方法中最慢的。
我认为在我测试的4个方法中,尽管Print3更快,但Print4可能是最通用的。
如果我有任何错误,请随时让我知道/自行修正!
编辑:我在下面添加了生成的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
使用Array.ForEach<T>方法(T[], Action<T>)
可以实现另一种方法,该方法属于Array
类。
Array.ForEach(myArray, Console.WriteLine);
相比于使用array.ToList().ForEach(Console.WriteLine)
需要两次迭代和在List
内部创建第二个数组(运行时间和内存消耗翻倍),只需进行一次迭代即可。
从 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
Console.WriteLine(String.Join(", ", array));
- undefined返回表示当前对象的字符串。
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
}
public class Foo
{
public override string ToString()
{
return "This is a formatted specific for the class Foo.";
}
}
这是使用数组打印字符串的最简单方法!!!
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();
}
}
}
我给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
中) - 这可能就足够了。
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);
}
}
}
我认为您除了测试代码之外不会使用它。
printfn "%A\n" [| 1, 2, 3 |]
) 或 b) 使用 Common Lisp ((let ((arr #(1 2 3))) (print arr))
)。在使用其他语言多年后编写了一些 C# 的 SO 答案之后,我无法相信结构体和数组的通用输出仍然不是 C# 的一部分。 - BitTickler