【问题标题】:Which is faster: Union or Concat?哪个更快:Union 还是 Concat?
【发布时间】:2020-05-18 21:44:43
【问题描述】:

哪个更快:UnionConcat

我不关心元素的顺序。

Enumerable.Union Method

Enumerable.Concat Method

【问题讨论】:

  • 尝试两种方式。拿出秒表。那你就知道了。基于猜测的性能“分析”,无论受过多少教育,实际上都不能作为做出工程决策的基础。

标签: c# .net linq union concat


【解决方案1】:

Union 删除重复项。 Concat 没有。

因此,如果来源包含任何共同的项目,或者有任何内部重复,它们会产生不同的结果。

如果您可以保证没有重复项,或者如果很少有重复项并且您不关心在输出中包含它们,Concat 会更快,因为无需针对已经产生的值测试每个值.

但是,如果有很多重复项并且您不需要它们,Union 中用于删除重复项的额外处理可能会被消耗结果的代码中的节省所抵消。

【讨论】:

    【解决方案2】:

    您只关心执行速度吗?您收到一个元素需要多长时间来处理它?

    Concat 更简单——它不需要自己执行任何处理,也不需要缓冲它已经返回的结果。但是,如果交集中有任何元素,它将产生更多的结果。如果您要花很长时间来处理每个结果,Concat 最终可能会实际上变慢。

    【讨论】:

    • 就我而言,最后我将使用 Distinct(),我认为这有利于使用 Union。
    • 如果你使用 Union,那么你之后就不需要再调用 Distinct 了。
    • 联合删除列表之间的重复项,但如果第一个列表本身有重复项,则联合不会删除这些重复项。所以 - 根据具体情况,可能仍需要调用 Distinct。
    • @DavidB:那不是真的(我不确定是不是某个时候)。 Union 将删除重复,即使它们仅在两个列表之一中重复。
    • @TimSchmelter,确认! (使用快速控制台应用程序):)
    【解决方案3】:

    上面说的是对的。 这里只是针对一些特殊情况的一点补充

    如果您必须连接例如两个列表并且如果您需要全速,请考虑使用yield。当然,这比 Linq 中的 UnionConcat 更不灵活和舒适。因此它只在特殊情况下才有意义。

    例如,此属性将提供与 List1.Concat(List2) 相同的值

    public IEnumerable<MyObject> AllObjects
    {
        get
        {
            foreach (MyObject o1 in List1)
                yield return o1;
    
            foreach (MyObject o2 in List2)
                yield return o2;
        }
    }
    

    【讨论】:

    • Concat 完全按照您在示例中显示的方式进行(参见:source)。所以没必要自己实现。
    猜你喜欢
    • 2014-05-16
    • 2011-03-26
    • 2012-06-12
    • 2010-09-29
    • 2011-03-14
    • 2012-07-15
    • 2011-09-22
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多