如何在c#中每3项使用逗号将数组连接到字符串

本文关键字:数组 连接 字符串 中每 3项 | 更新日期: 2023-09-27 18:27:43

假设我有一个数组。

string[] temp = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };

我想加入他们的逗号每3项如下。

string[] temp2 = { "a,b,c", "d,e,f", "g,h,i", "j" };

我知道我可以使用

string temp3 = string.Join(",", temp);

但这给了我的结果

"a,b,c,d,e,f,g,h,i,j"

有人有主意吗?

如何在c#中每3项使用逗号将数组连接到字符串

一种快速简单的方法,将您的项目分为三组:

string[] temp = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
string[] temp2 = temp.Select((item, index) => new 
{
    Char = item,
    Index = index
})
.GroupBy(i => i.Index / 3, i => i.Char)
.Select(grp => string.Join(",", grp))
.ToArray();

更新为使用.GroupBy的重载,允许您指定元素选择器,因为我认为这是一种更干净的方法。从@Jamiec的回答中合并

这里发生了什么:

  1. 我们将temp的每个元素投影到一个新元素中——一个具有CharIndex属性的匿名对象
  2. 然后,我们根据项的索引和3之间的整数除法结果对结果的Enumerable进行分组。对于.GroupBy的第二个参数,我们指定希望组中的每个项都是匿名对象的Char属性
  3. 然后,我们调用.Select来再次投影分组的元素。这一次,我们的投影函数需要调用string.Join,将每组字符串传递给该方法
  4. 在这一点上,我们有一个IEnumerable<string>,它看起来像我们想要的那样,所以只需要调用ToArray来从我们的Enumerable创建一个数组

您可以将Chunk方法(归功于CaseyB)与string.Join:相结合

string[] temp2 = temp.Chunk(3).Select(x => string.Join(",", x)).ToArray();
/// <summary>
/// Break a list of items into chunks of a specific size
/// </summary>
public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize)
{
    while (source.Any())
    {
        yield return source.Take(chunksize);
        source = source.Skip(chunksize);
    }
}

可以通过将Linq语句链接在一起来完成:

var grouped = temp.Select( (e,i) => new{ Index=i/3, Item=e})
              .GroupBy(x => x.Index, x=> x.Item)
              .Select( x => String.Join(",",x) );

现场示例:http://rextester.com/AHZM76517

您可以使用MoreLINQ Batch:

var temp3 = temp.Batch(3).Select(b => String.Join(",", b));