我想从一个双精度数组的列表中获取一个双精度数组,其中该数组的第一个值与列表中其他数组的第一个值相比是最高值
例如,如果数组列表为(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
答案 0 :(得分:1)
抱歉,我的基本知识有点生锈,我将用C#编写,希望您能理解。
每当需要LINQ函数时,只要您需要一次检查序列中的每个项目,并且想要对当前正在检查的项目进行某些操作,请想到Aggregate
。
这将使用第一个源元素初始化变量highestValue;然后它将比较每个具有最高值的源元素,并保留最高的元素:
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中:使用其他聚合:
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);
简单的漫画卓悦!
答案 1 :(得分:0)
尝试一下。这将按每个数组的第一个位置,然后按数组的第二个位置,对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})