包装 String.Join 方法

Wrap String.Join method

我创建了一个这样的程序,运行良好:

using System;
class Program {
   static string S(string[] a) => String.Join(',', a);
   static void Main() {
      string[] a = {"May", "June", "July"};
      Console.WriteLine(S(a));
   }
}

但是如果我稍微改变一下程序:

using System.Linq;
using System;
class Program {
   static string S(string[] a) => String.Join(',', a);
   static void Main() {
      string[] a = {"May", "June", "July"};
      var a2 = a.Skip(1);
      Console.WriteLine(S(a2));
   }
}

我收到这个错误:

error CS1503: Argument 1: cannot convert from
'System.Collections.Generic.IEnumerable<string>' to 'string[]'

然后我尝试将功能更改为:

static string S<T>(T a) => String.Join(',', a);

但我只得到这个输出:

System.Linq.Enumerable+ListPartition`1[System.String]

编写此函数的正确方法是什么,以便接受两种类型?

一个字符串数组是 IEnumerable<string> 并且 String.Join 可以接受一个 IEnumerable 字符串。

static string S(IEnumerable<string> a) => String.Join(',', a);

将接受字符串数组和 Skip(1)

的结果
static string S(IEnumerable<string> a) => String.Join(',', a);
public static void Main()
{
    string[] a = {"May", "June", "July"};
    Console.WriteLine(S(a));
    var a2 = a.Skip(1);
    Console.WriteLine(S(a2));
}

实例:https://dotnetfiddle.net/0MOjL5

如果您打算支持的不仅仅是字符串(例如 array/enumerable 的整数),那么可以将其更改为:

static string S<T>(IEnumerable<T> a) => String.Join(',', a);

并使用任何类型的数组调用,这将 ToString 变成有意义的东西

Console.WriteLine(S(new[]{ 1, 2, 3})); // "1,2,3"

注意调用它时不需要指定类型 T - 这是推断的。

另一个选项,编码为JSON:

using C = System.Console;
using J = System.Text.Json.JsonSerializer;
using System.Linq;

class Program {
   static void Main() {
      string[] a = {"May", "June", "July"};
      var a2 = a.Skip(1);
      C.WriteLine(J.Serialize(a) + J.Serialize(a2));
   }
}

https://docs.microsoft.com/dotnet/api/system.text.json.jsonserializer