包装 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<string>
,因为string.Join
的重载将处理该问题。
@jdweng 我想你的意思是S(a2.ToArray())
【参考方案1】:
字符串数组是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
如果您打算支持的不仅仅是字符串(例如数组/整数的枚举),那么可以将其更改为:
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 方法的主要内容,如果未能解决你的问题,请参考以下文章