对于任何对象的数组是否有类似String.Join()的方法?

时间:2016-09-11 21:36:44

标签: c#

是否有方法在数组中的每个对象之间插入对象?

例如,给定一个非零整数数组,有没有办法在每个元素之间插入0?例如。将[1, 2, 3]更改为[1, 0, 2, 0, 3]

具体来说,我希望做一些像String.Join(0, [1, 2, 3])这样的声明式的东西,但是使用任意数组(不只是char数组)。一种非声明性的方式是这样的:

public static IList<T> InterleaveWith<T>( this IList<T> @this, T divider ) {
    IList<T> joined = new List<T>( @this.Count * 2 );
    foreach( T item in @this ) {
        joined.Add( item );
        joined.Add( divider );
    }
    joined.RemoveAt( joined.Count - 1 );

    return joined;
}

2 个答案:

答案 0 :(得分:6)

没有内置方法,但您可以使用yield return轻松完成:

static IEnumerable<T> Join<T>(T separator, IEnumerable<T> items) {
    bool first = true;
    foreach (var item in items) {
        if (!first) {
            yield return separator;
        } else {
            first = false;
        }
        yield return item;
    }
}

Demo.

答案 1 :(得分:0)

使用尽可能多的内置功能的方法是使用SelectMany

static IEnumerable<T> Join<T>(this IEnumerable<T> items, T separator) =>
    items.SelectMany((item, index) =>
       index == 0 ? new[] { item } : new[] { separator, item });

但实际上,我可能会选择类似于@dasblinkenlight所写的自定义实现。