包装 String.Join 方法

Posted

技术标签:

【中文标题】包装 String.Join 方法【英文标题】:Wrap String.Join method 【发布时间】:2020-10-19 16:11:21 【问题描述】:

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

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]

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

【问题讨论】:

只需要添加 ToArray() : String.Join(',', a.ToArray()) 或者更改方法以采用IEnumerable&lt;string&gt;,因为string.Join 的重载将处理该问题。 @jdweng 我想你的意思是S(a2.ToArray()) 【参考方案1】:

字符串数组是IEnumerable&lt;string&gt;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

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

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

并使用任何类型的数组调用,该数组将 ToString 用于有意义的事情

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

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

【讨论】:

【参考方案2】:

另一种选择,编码为 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

【讨论】:

以上是关于包装 String.Join 方法的主要内容,如果未能解决你的问题,请参考以下文章

带有默认参数的包装方法,该参数是指向另一个包装类型的空指针

tomcat4标准包装器StandardWrapper

jquery的 包装集

Java进阶包装类

对象的 C# 包装器

Java包装类