从列表的子集中有效选择

时间:2019-04-19 05:12:22

标签: 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)

1 个答案:

答案 0 :(得分:5)

您可以为此使用LINQ:

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

Try it online