List.IndexOf() - 返回最终出现的索引,而不是第一个
本文关键字:索引 第一个 IndexOf 返回 List | 更新日期: 2023-09-27 18:26:12
int highestValue = someList.IndexOf(someList.Max())
someList 包含大量重复项,someList.Max(( 返回最高值的第一个实例的索引。
我可以使用一些技巧(反转列表的顺序?(来获取列表中最高值的最终出现的索引,而不是诉诸于编写手动方法?
试试这个:
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());