Эффективный выбор из подмножеств списка - PullRequest
1 голос
/ 19 апреля 2019

Учитывая список векторов, как я могу эффективно выбрать все самые большие значения свойства среди всех членов, которые разделяют другие значения среди различных свойств.

Например, со стандартным Vector3, как бы я выбрал Vector3, которые имеют наибольшее значение Y относительно всех других членов с идентичными значениями X и Z.

Мой текущий метод работы - перебирать список следующим образом:

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 Ответ

5 голосов
/ 19 апреля 2019

Вы можете использовать LINQ для этого:

var result = vectors
    .GroupBy(v => Tuple.Create(v.X, v.Z))
    .Select(vg => vg.OrderByDescending(v => v.Y).First())
    .ToList();
  • GroupBy будет использовать кортеж X и Z в качестве ключа.
  • от каждогогруппа, мы Select значение с наибольшим значением Y.

Попробуйте онлайн

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...