查找列表中数字开始上升的索引
本文关键字:索引 开始 列表 数字 查找 | 更新日期: 2023-09-27 18:09:30
假设我有一个数字列表,我想知道列表中的数字从哪里开始递减,没有特定的顺序,一个例子将是理想的!
1,
2,
2,
3,
3,
4,
4,
5,
5,
4, <= this should be my output
4,
3,
3,
2,
2,
1,
谢谢
您可以在IEnumerable<TSource>
上创建自己的扩展方法
public static class MyEnumerable
{
public static IEnumerable<TSource> Descending<TSource>(this IEnumerable<TSource> source)
where TSource : IComparable<TSource>
{
using (var e = source.GetEnumerator())
{
TSource previous;
if (e.MoveNext())
{
previous = e.Current;
while (e.MoveNext())
{
if (previous.CompareTo(e.Current) > 0)
yield return e.Current;
previous = e.Current;
}
}
}
}
}
使用var input = new List<int>() { 1, 2, 3, 2, 4, 5, 6, 7, 8, 9 };
var firstDescending = input.Descending().First();
不是Linq而是c#的方式:
public int FirstDecreasingIndex(IList<int> myList)
{
for (int i = 0; i < myList.Count - 1; i++)
{
if (myList[i] > myList[i + 1])
return i+1;
}
return -1; //Or some other value
}
对于这个输入:{ 1,2,3,2,4,5,6,7,8,9 }
函数将返回3
,因为它是列表第一次开始递减的第一个索引
对于真正的功能方法:
List<int> numbers = ...;
var firstDecreasingValue =
numbers.Skip(1).Zip(numbers, (number, previous) => new { number, previous })
.Where(x => x.number.CompareTo(x.previous) < 0)
.Select(x => x.number)
.First();
不完全一致,但我认为已经足够接近了
var list = new List<int> { 1, 2, 3, 4, 5, 4, 3, 2, 1 };
var index = Enumerable.Range(0, list.Count).First(i => i > 0 && list[i] < list[i - 1]);
这里是使用Enumerable.Aggregate
和Tuple
的"在线":s:
var numbers = new[] { 1, 2, 2, 3, 3, 4, 4, 5, 5, 4, 4, 3, 3, 2, 2, 1 };
var idx = numbers.Aggregate(Tuple.Create(true, 0, 0), (tuple, x) =>
tuple.Item1
? tuple.Item3 <= x
? Tuple.Create(true, tuple.Item2 + 1, x)
: Tuple.Create(false, tuple.Item2, x)
: tuple)
.Item2;
聚合元组存储三个值:
- 是否继续搜索增加,
- 数组索引,递增直到检测到第一个减少为止,
- 项值用于与数组中的后续值进行比较,直到检测到第一次减少为止。
聚合完成后,从元组中选择Item2
值,其中存储了第一个减少的索引。
以上代码的输出将是9
,即第一个减少值的基数零索引。如果您从聚合元组返回Item3
,您将获得第一个减少的值(如果序列完全不是减少的,则是最后一个值)。