说我有一个数字列表,我想知道列表中的数字在哪里开始减少,没有特别的顺序,一个例子是理想的!
1,
2,
2,
3,
3,
4,
4,
5,
5,
4, <= this should be my output
4,
3,
3,
2,
2,
1,
感谢
答案 0 :(得分:6)
您可以在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();
答案 1 :(得分:3)
不是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
,因为它是列表首次开始递减的第一个索引。
答案 2 :(得分: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();
答案 3 :(得分:1)
不完全是linq,但我认为足够接近
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]);
答案 4 :(得分:1)
以下是使用Enumerable.Aggregate
和Tuple
的“oneliner”: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
,则会获得第一个减少的值(如果序列完全不减少,则为最后一个值)。