c# - 从列表的子集中高效地进行选择

标签 c# list performance linq

给定一个向量列表,我如何在不同属性之间共享其他值的所有成员中高效地选择属性的所有最大值。

例如,对于标准 Vector3,我将如何选择相对于具有相同 X 和 Z 值的所有其他成员具有最大 Y 值的 Vector3。

我目前的工作方法是像这样遍历列表:

Vector3 current = Vector3.Zero;
List<Vector3> out = new List<Vector3>();
foreach(var member in MyList)
{
    current= member;
    foreach(var compare in MyList)
    {
        if(!predicate(current,compare))
            current = compare;
    }
    out.Add(largest);
}

但这似乎不是特别有效,因为它执行 n 次平方比较,其中 n 是列表的长度。

关于将其减少到更可行的数字的任何建议,因为我打算在我的代码的性能关键部分使用它。

对于X和Z值相等的谓词,取Y的最大值

示例输入:

(1,1,1)
(1,2,1)
(1,4,1)
(2,3,2)
(2,5,2)
(1,4,2)
(1,2,2)
(1,1,2)
(2,5,1)
(2,4,1)
(2,9,1)

预期输出:

(1,4,1)
(2,5,2)
(1,4,2)
(2,9,1)

最佳答案

您可以为此使用 LINQ:

var result = vectors
    .GroupBy(v => Tuple.Create(v.X, v.Z))
    .Select(vg => vg.OrderByDescending(v => v.Y).First())
    .ToList();
  • GroupBy 将使用 XZ 的元组作为键。
  • 从每组中,我们选择具有最大Y值的值。

Try it online

关于c# - 从列表的子集中高效地进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756903/

相关文章:

php - 如何粗略估计 LAMP 应用容量?

c# - 使用丢弃策略的滞后斐波那契生成器

c# - 如何跳过 Foreach 中的记录

list - redis 以原子方式切换值

javascript - 使用一次性绑定(bind)的 ng-repeat - 届时跟踪对性能有影响吗?

mysql - 新的 MySQL 服务器比旧的慢

c# - MVC Action 属性测试

c# - 找不到 Xml 元素

当我能够使用索引打印相同的值时,Python 无法删除列表中的值索引

python - 遍历列表 - 分割字符串