List.IndexOf() - 返回最终出现的索引,而不是第一个

本文关键字:索引 第一个 IndexOf 返回 List | 更新日期: 2023-09-27 18:26:12

int highestValue = someList.IndexOf(someList.Max())

someList 包含大量重复项,someList.Max(( 返回最高值的第一个实例的索引。

我可以使用一些技巧(反转列表的顺序?(来获取列表中最高值的最终出现的索引,而不是诉诸于编写手动方法?

List.IndexOf() - 返回最终出现的索引,而不是第一个

试试这个:

int highestValue = someList.LastIndexOf(someList.Max()) ;

所有其他答案都是完全正确的,必须注意的是,这需要对列表进行 2 次迭代(一次用于查找 max 元素,第二次用于查找最后一个索引(。对于整数列表,这不是问题,但如果迭代更复杂,这里有一个替代方案:

var highestValue = someList.Select((val, ind) => new { Value = val, Index = ind })
                           .Aggregate((x, y) => (x.Value > y.Value) ? x : y)
                           .Index;

你的意思是像获取最后一次出现的索引?那将是:

int highestValueIndex = someList.LastIndexOf(someList.Max())

但是,您应该注意这样一个事实,即您在原始代码和上面的代码中都要对数据进行两次传递。如果你想在一次传递中完成它(如果你的数据集很大,你应该只担心这一点(,你可以这样做:

static int LastIndexOfMax(List<int> list)
{
    // Empty list, no index.
    if (list.Count == 0) return -1;
    // Default to first element then check all others.
    int maxIdx = 0, maxVal = list[0];
    for (int idx = 1; idx < list.Count; ++idx) {
        // Higher or equal-and-to-the-right, replace.
        if (list[idx] >= maxVal) {
            maxIdx = idx;
            maxVal = list[idx];
        }
    }
    return maxIdx;
}

使用 LastIndexOf

int highestValue = someList.LastIndexOf(someList.Max());