从double数组的列表中获取double数组,其中array中的第一个值是使用linq的最大第一个值

时间:2019-05-21 20:08:45

标签: vb.net linq lambda

我想从一个双精度数组的列表中获取一个双精度数组,其中该数组的第一个值与列表中其他数组的第一个值相比是最高值

例如,如果数组列表为(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 个答案:

答案 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})