【问题标题】:Does Enumerable.Concat always append at the end of the first collection?Enumerable.Concat 是否总是附加在第一个集合的末尾?
【发布时间】:2017-02-14 09:10:37
【问题描述】:

Enumerable.Concat 总是附加在第一个集合的末尾吗?

例子:

object someObject = new object();
List<object> listA = new List<object>();
listA.Add(new int());
object item = listA.Concat(new object[] { (object)new float() }).FirstOrDefault();

在每次使用Concat 之后,是否保证item 将是int 而不是float?这意味着:

[0] int
[1] float

MSDN 没有说明结果集合中的元素顺序,但示例显示顺序是第一个集合中的元素,然后是第二个集合中的元素。

【问题讨论】:

    标签: c# ienumerable concat


    【解决方案1】:

    Concat 是一种 LINQ 方法。这意味着它是一个查询。它不会创建列表或其他类型的集合,而是创建序列。

    所以Concat 实际上所做的是组合 两个源序列。当您遍历Concat 的结果时,您首先遍历第一个序列,然后遍历第二个序列。因此顺序永远不会改变。

    所以,是的

    每次使用 Concat 后,该项目将是 int 而不是 float


    MSDN 没有提到元素顺序

    好吧does say

    连接两个序列。

    to concatenate 表示将一个放在另一个之后,而不是混淆它们。


    来自reference source

    public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) {
        if (first == null) throw Error.ArgumentNull("first");
        if (second == null) throw Error.ArgumentNull("second");
        return ConcatIterator<TSource>(first, second);
    }
    
    static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second) {
        foreach (TSource element in first) yield return element;
        foreach (TSource element in second) yield return element;
    }
    

    所以你看到两个连续的foreach 将首先产生第一个序列的元素,然后是第二个序列的元素。

    【讨论】:

      猜你喜欢
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2017-08-11
      相关资源
      最近更新 更多