代码之家  ›  专栏  ›  技术社区  ›  Gabe Moothart

向IEnumerable<T>添加或预先添加单个值的简单方法是什么?

  •  9
  • Gabe Moothart  · 技术社区  · 14 年前

    我需要在IEnumerable前面加一个值(在本例中, IEnumerable<string[]> List<T> 只是包装第一个值,以便我可以调用 Concat :

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

    4 回复  |  直到 14 年前
        1
  •  24
  •   Greg    14 年前

    为此,我编写了自定义扩展方法:

    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;
    }
    

    在您的场景中,您可以这样写:

    var all = GetData().Prepend(GetHeaders());
    

    正如chilltemp所评论的,这不会改变原始集合。在真正的Linq时尚中,它产生了一个新的 IEnumerable<T> .

    注: 建议对以下对象进行急切的空参数检查: source

        2
  •  8
  •   Reed Copsey    14 年前

    使用 Enumerable.Concat 扩展方法。对于附加值而不是前置值,只需调用 Concat 相反(即: GetData().Concat(GetHeaders());

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

     var all = (new[] {GetHeaders()}).Concat(GetData());
    
        3
  •  1
  •   desco    14 年前

    Rx包含StartWith方法,该方法将值预先添加到序列中。还可以将返回值包装为序列,以便通过Concat追加。

            var c = new[] {4};
            var c1 = c.StartWith(1, 2, 3);
            var c2 = c1.Concat(EnumerableEx.Return(5));
    
            c2.Run(Console.Write); // 12345
    
        4
  •  0
  •   Gabe Moothart    14 年前

    另一个选项是helper方法,它从单个项创建序列:

    public static class EnumerableExt
    {
        public static IEnumerable<T> One<T>(T item)
        {
            yield return item;
        }
    }
    
    ...
    //prepend:
    EnumerableExt.One( GetHeaders() ).Concat( GetData() );
    
    //append:
    GetData().Concat( EnumerableExt.One( GetHeaders() );
    
        5
  •  0
  •   aloisdg    5 年前

    对于.NET4.7.1和更新版本来说,最简单、最干净的方法是使用无副作用的 Prepend() Append() .

    // Creating an array of numbers
    var numbers = new[] { 1, 2, 3 };
    
    // Prepend and Append any value of the same type
    var results = numbers.Prepend(0).Append(4);
    
    // output is 0, 1, 2, 3, 4
    Console.WriteLine(string.Join(", ", results ));