List.IndexOf() - 返回最后一次出现的索引而不是第一次?

时间:2014-10-10 09:39:46

标签: c# list ienumerable

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

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

我是否可以使用一些技巧(颠倒列表的顺序?)来获取列表中最高值的最终出现的索引,而不是求助于编写手动方法?

4 个答案:

答案 0 :(得分:4)

试试这个:

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

答案 1 :(得分:3)

你的意思是得到index of the last occurrence?那将是:

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;
}

答案 2 :(得分:3)

所有其他答案完全正确,必须注意这需要在列表上进行2次迭代(一次查找最大元素,第二次查找最后一个索引)。对于一个非问题的整数列表,但如果迭代更复杂,可以选择以下方法:

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

答案 3 :(得分:1)

使用LastIndexOf

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