Получить массив double из списка массивов double, где первое значение в массиве - это максимальное первое значение с использованием linq - PullRequest
0 голосов
/ 21 мая 2019

Я хочу получить массив double из списка массива double, где первое значение массива является наибольшим по сравнению с первым значением других массивов в списке

ДляНапример, если список массивов равен (4,5), (-3,2), (7,1), он вернет (7,1).

Я пробовал это, но безуспешно:

Dim vertices as List(of Double()) = MethodToGetList()

dim rv as Double() = vertices.Select(Function(x As Double()) x.First.MaxValue).ToArray

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Извините, мои базовые знания немного устарели, я сделаю это на C #, я надеюсь, вы поймете суть.

Всякий раз, когда вам нужна функция LINQ, где вам нужно изучить каждый элементВаша последовательность ровно один раз, и вы хотите что-то сделать с элементом, который в данный момент исследуется, подумайте о Aggregate.

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

List<List<double>> mySource = ...
var result = mySource.Aggregate( (highestValue, nextValue) =>
    (nextValue[0] > highestValue[0]) ? nextValue : highestValue);

Это будет похоже на:

List<double> highestValue = mySource[0];
for (int i=1; i<mySource.Count; ++i)
{
    if (mySource[i][0] > higestValue[0])
    {
        // found a new highestValue
        highestValue = mySource[i];
    }
    // else: keep the highest value
}

Легко видеть, что этоработает только если mySource не пусто.Если у вас есть пустой источник, вы должны думать о том, что вы хотите в результате.Мы инициализируем с этим emptyResult:

List<double> emptyResult = ... // what do you want to use if there is nothing in your source?

List<double> highestValue = emptyResult;
for (int i=0; i<mySource.Count; ++i)
{
    if (mySource[i][0] > higestValue[0])
    {
        // found a new highestValue
        highestValue = mySource[i];
    }
}

А теперь в LINQ: используйте другой Aggregate:

var result = mySource.Aggregate(emptyResult, // use this as seeder
    (nextValue[0] > highestValue[0]) ? nextValue : highestValue);

Это поможет, если у вас есть пустая последовательность.Но что если один из ваших списков в источнике будет нулевым или пустым?

Давайте предположим, что вы вообще не хотите их рассматривать:

var nonEmptyArrays = mySource.Where(list => list != null && list.Count != 0)
var result = noneEmptyArrays.Aggregate((emptyResult, // use this as seeder
    (nextValue[0] > highestValue[0]) ? nextValue : highestValue);

Simple Comme Bonjour!

0 голосов
/ 21 мая 2019

Попробуй это. Это упорядочивает список массивов vertices по первой позиции каждого массива, а затем по второй позиции массива. Тогда в случае тех же данных (ниже) список будет выглядеть так: (7,1), (7,2), .... Затем последний фрагмент оператора захватывает первый элемент в отсортированном списке, поэтому возвращает (7, 1)

Dim rv As Double() = vertices.OrderByDescending(Function(v) v(0)).ThenBy(Function(v) v(1)).FirstOrDefault

Данные для проверки:

Dim vertices As List(Of Double()) = New List(Of Double())

vertices.Add(New Double() {4, 5})
vertices.Add(New Double() {-1, 2})
vertices.Add(New Double() {7, 1})
vertices.Add(New Double() {7, 2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...