Извините, мои базовые знания немного устарели, я сделаю это на 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!