我有一个a
100 个整数的数组。a[3]
通过a[70]
AND 该最小值的索引找到最小值的推荐方法是什么?假设没有重复值。
我知道循环遍历相关索引范围的笨拙方式:
for(i = 3; i < 70, i++)
{
...
}
我正在寻找一种更优雅的方式在 C# 中执行此操作,而不是循环。谢谢。
找出分钟
List<int> templist = a.Skip(3).Take(67).ToList();
int minimum = templist.Min();
对于索引
int index = templist.FindIndex(i => i == minimum) + 3;
我添加了 3 因为列表中的索引将比原始序列中的索引少 3 a
。
它在做什么
您必须使用循环,因为它是一个序列。既然你说优雅,所以我使用了 LINQ 而不是 for 循环(即使它也这样做循环)。
如果您的数据结构未排序,那么如果不循环遍历子列表中的所有元素,则无法做到这一点,或者如果您通过提供的 API 使用一些隐式循环。
您不能使用排序集合,因为您正在处理它的子部分(因此您需要为列表的一部分创建一个排序集合),所以无论如何您都必须循环它。
LINQAggregate
不是最简单的,但它可以说是“优雅”解决方案中效率最低的(尽管它们仍然比简单的循环更多的代码行。此外,迭代自己仍然是最好的,因为你没有分配任何额外的记忆)。
但无论如何,如果你觉得有必要让你的继任者把你挂在雕像上,你可以这样做而不是简单的循环:
var minValueAndItsIndex = a
.Skip(3)
.Take(70 - 3)
.Select((value, index) => new { Value = value, Index = index + 3})
.Aggregate((tuple1, tuple2) => (tuple1.Value < tuple2.Value) ? tuple1 : tuple2);
如果您创建一个ValueType
基于 2-item 的元组并使用它而不是匿名类型,它将与更有效的直接迭代相当,因为它不会分配任何额外的内存。