gpt4 book ai didi

performance - 嵌套与链式联合

转载 作者:行者123 更新时间:2023-12-04 03:11:01 24 4
gpt4 key购买 nike

从逻辑上讲,以下都是相同的:

var foo = (  A.Union(B).Union(C).Union(D)  ).ToList();
var bar = ( A.Union(B.Union(C.Union(D))) ).ToList();
var baz = ( D.Union(C.Union(B.Union(A))) ).ToList();

它们最后都应该返回完全相同的列表。


它们之间有什么区别(如果有的话)?

我猜想唯一的区别是与性能相关的问题,即您迭代每个集合的频率?然后 foobaz 具有完全相同的性能 - 迭代 A 4 次,但仅迭代 D一次?

是这样吗?

是否有任何其他有趣的属性可能会导致您关心做一个而不是另一个?

最佳答案

这些解决方案都没有多次迭代其参数。此外,参数按照它们在文本中给出的顺序迭代,即 A , B , C , D对于 foobar , 和 D , C , B , A对于 baz .

您可以使用一个简单的生成器来演示这一点,该生成器会在您迭代时打印它返回的项目:

class VisibleIterator : IEnumerable<string> {
private readonly string name;
public VisibleIterator(string name) {
this.name = name;
}
public IEnumerator<string> GetEnumerator() {
for (var i = 0 ; i != 4 ; i++) {
var res = name+i;
Console.WriteLine(res);
yield return res;
}
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
}

Demo.

集合没有被多次枚举的原因是UnionIterator<T> , Union<T> 背后的代码, 保留已访问项目的哈希集:

static IEnumerable<TSource> UnionIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer) {
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in first)
if (set.Add(element)) yield return element;
foreach (TSource element in second)
if (set.Add(element)) yield return element;
}

Set<TSource> set 的大小可能会导致性能上的小差异里面UnionIterator<T> .您的每个示例中都会有三个这样的集合 - 每个 Union 一个。称呼。顶级set总是以 Union 的所有成员结束结果。中级set但是,s 可能有更多或更少的项目,这取决于您合并集合的顺序,以及每个集合中项目的相对数量。

关于performance - 嵌套与链式联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49493797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com