在列表中查找数字开始上升的索引

时间:2013-04-17 05:26:41

标签: c# linq

说我有一个数字列表,我想知道列表中的数字在哪里开始减少,没有特别的顺序,一个例子是理想的!

1,
2,
2,
3,
3,
4,
4,
5,
5,
4, <= this should be my output
4,
3,
3,
2,
2,
1,

感谢

5 个答案:

答案 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.AggregateTuple的“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;

聚合元组存储三个值:

  1. 是否继续搜索增加,
  2. 数组索引,递增直到检测到第一个减少,
  3. 项目值,用于与数组中的后续值进行比较,更新直到检测到第一次减少。
  4. 聚合完成后,从元组中选择Item2值,其中存储第一个减少的索引。

    上述代码的输出为9,即第一个减小值的基零指数。如果您从聚合元组返回Item3,则会获得第一个减少的值(如果序列完全不减少,则为最后一个值)。