【发布时间】:2021-06-06 04:12:01
【问题描述】:
什么是 C#/LINQ 中最快的等价物,可以像这样比较数组的所有元素组合,如果它们不在存储桶中,则将它们添加到存储桶中。又名。如何在 C# 中优化这段代码。
// pseudocode
List<T> elements = { .... }
HashSet<T> bucket = {}
foreach (T element in elements)
foreach (var myelemenet in elements.Where(e => e.id != element.id))
{
if (!element.notInTheList)
{
_elementIsTheSame = element.Equals(myelement);
if (_elementIsTheSame)
{
// append element to a bucket
if (!elementIsInTheBucket(bucket, element))
{
element.notInTheList = true;
addToBucket(bucket, element);
}
}
}
}
}
// takes about 150ms on a fast workstation with only 300 elements in the LIST!
bucket中元素的最终顺序很重要
【问题讨论】:
-
“桶”是什么意思?您是否尝试从 MoreLINQ 实现类似
DisctinctBy的东西? -
一个数组,其中元素的顺序很重要。
-
“如果不是元素不在桶中,则添加” - 您可能需要修复一些命名
-
你能把“桶内”测试移到外循环吗?在所有元素的循环中,您再次循环相同的元素:O(n^2)
-
真的不清楚你想用这个伪代码做什么,我们也不会猜到。缓慢的部分显然是内部循环——肯定是
Where(e => e.property != element.property),如果它包含线性搜索,最终是elementIsInTheBucket。但如果mylelement.property != element.property,我看不出element.Equals(myelement)怎么可能是真的。
标签: c# performance linq optimization