将单个值附加或前置到IEnumerable <T>的简单方法是什么?

Gab*_*art 9 c# linq ienumerable

我需要在IEnumerable之前添加一个值(在本例中IEnumerable<string[]>).为了做到这一点,我正在创建一个List<T>just来包装第一个值,以便我可以调用Concat:

// get headers and data together
IEnumerable<string[]> headers = new List<string[]> {
    GetHeaders()
};
var all = headers.Concat(GetData());
Run Code Online (Sandbox Code Playgroud)

呸.有没有更好的办法?你会如何处理附加值的相反情况?

Gre*_*reg 23

我编写了自定义扩展方法来执行此操作:

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, T item)
{
    foreach (T i in source)
        yield return i;

    yield return item;
}

public static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T item)
{
    yield return item;

    foreach (T i in source)
        yield return i;
}
Run Code Online (Sandbox Code Playgroud)

在您的场景中,您会写:

var all = GetData().Prepend(GetHeaders());
Run Code Online (Sandbox Code Playgroud)

正如chilltemp评论的那样,这不会改变原始集合.以真正的Linq方式,它产生了一个新的IEnumerable<T>.

注意:建议使用急切的空参数检查source,但为简洁起见未显示.

  • 优雅.应该注意,这将通过枚举现有集合返回新的IEnumerable <T>.它实际上并不附加/前置原始集合. (3认同)

Ree*_*sey 7

使用Enumerable.Concat扩展方法.要附加值而不是预先添加,您只需Concat反向调用.(即:GetData().Concat(GetHeaders());)

如果GetHeaders()返回单个字符串数组,我个人可能将它包装在单个元素数组而不是列表中:

 var all = (new[] {GetHeaders()}).Concat(GetData());
Run Code Online (Sandbox Code Playgroud)