包装 String.Join 方法

-1 c# linq generics ienumerable

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

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

但是,如果我稍微更改程序:

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));
   }
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

error CS1503: Argument 1: cannot convert from
'System.Collections.Generic.IEnumerable<string>' to 'string[]'
Run Code Online (Sandbox Code Playgroud)

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

static string S<T>(T a) => String.Join(',', a);
Run Code Online (Sandbox Code Playgroud)

但我只是得到这个输出:

System.Linq.Enumerable+ListPartition`1[System.String]
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*iec 7

字符串数组是IEnumerable<string>并且String.Join可以采用字符串的 IEnumerable 。

static string S(IEnumerable<string> a) => String.Join(',', a);
Run Code Online (Sandbox Code Playgroud)

将接受字符串数组和结果 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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

static string S<T>(IEnumerable<T> a) => String.Join(',', a);
Run Code Online (Sandbox Code Playgroud)

并用任何类型的数组调用,这将ToString是有意义的

Console.WriteLine(S(new[]{ 1, 2, 3})); // "1,2,3"
Run Code Online (Sandbox Code Playgroud)

请注意T,调用它时无需指定类型- 这是推断的。