Найдите в списке кортежей кортеж с самым высоким значением Item1 - затем удалите его из списка - PullRequest
1 голос
/ 10 июля 2019

У меня есть список кортежей типа:

List<Tuple<int, int>> listOfStuffs= new List<Tuple<int, int>>();

Теперь, учитывая, что я заполнил свой список некоторыми полезными значениями, как я могу извлечь из этого списка (в другом кортеже) кортеж, содержащий самое высокое значение Item1?
Если найдено более одного совпадения, он должен возвращать только первое.

Это не работает, так как возвращает значение Int, а не фактический кортеж:

Tuple<int, int> selectedTuple = listOfStuffs.Max(t => t.Item1);  

Как только мы нашли это совпадение, как его можно удалить из listOfStuffs?

Я сделал следующее, и кажется, что при наличии дубликатов удаляется только один кортеж из списка (при необходимости):

listOfStuffs.Remove(new Tuple<int, int>(selectedTuple.Item1, selectedTuple.Item2));

Может быть, есть способ объединить эти операции?

Ответы [ 3 ]

3 голосов
/ 10 июля 2019

Поскольку Tuple реализует IComparable, вы можете просто использовать Max, чтобы получить кортеж с самым высоким значением Item1:

Tuple<int, int> Result = listOfStuffs.Max();
2 голосов
/ 10 июля 2019

Вы можете отсортировать список и взять первое:

var tupleWithMaxItem1 = listOfStuffs.OrderByDescending(x => x.Item1).First();

Или вы можете использовать MoreLinq MaxBy() расширение:

var tupleWithMaxItem1 = listOfStuffs.MaxBy(x => x.Item1);

MaxBy() будет быстрее, чем сначала сортировать список.

2 голосов
/ 10 июля 2019

Вы ищете ArgMax , который не реализован в стандарте Linq, но может быть закодирован с помощью Aggregate:

Tuple<int, int> Result = listOfStuffs.Aggregate((s, a) => s.Item1 > a.Item1 ? s : a);

Если несколько элементов имеют одинаковое Item1 значение, мы возвращаем first one;если вы хотите вернуть последний один, измените > на >=:

Tuple<int, int> Result = listOfStuffs.Aggregate((s, a) => s.Item1 >= a.Item1 ? s : a);
...