LINQ ile bir dizinin sıralı olup olmadığını test etme

LINQ ile bir dizinin sıralı olup olmadığını test etme

Elinizdeki dizinin sıralı olup olmadığını nasıl test edersiniz?

Diyelim ki elinizde bir dizi var:

var dizi = new int[] { 1, 5, 3, 4, 8, 9, 10 };

Bu dizi sıralı mı değil mi nasıl anlarız?

Çeşitli algoritmalar düşünülebilir tabii, ama en kısa yoldan en az kodla nasıl çözeriz?

Linq tam bu noktada işimizi görecektir.

Eğer .Net Framework 4+ kullanıyorsanız Enumerable.Zip metodunu kullanabiliriz:

var dizi = new int[] { 1, 5, 3, 4, 8, 9, 10 };
var siraliMi = dizi.Zip(dizi.Skip(1), (a, b) => new { a, b }).All(p => p.a < p.b);
Console.WriteLine(siraliMi);

// false

Bir de sıralı bir dizi üzerinde çalıştıralım:

var dizi = new int[] { 1, 3, 4, 5, 8, 9, 10 };
var siraliMi = dizi.Zip(dizi.Skip(1), (a, b) => new { a, b }).All(p => p.a < p.b);
Console.WriteLine(siraliMi);

// true

 

Eğer .Net Framework 4'ten daha eski bir sürüm kullanıyorsanız şu genişletme metodunu kullanabilirsiniz:

public static class GenisletmetMetotlari
{
  public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first,
    IEnumerable<TSecond> second,
    Func<TFirst, TSecond, TResult> selector)
  {
    var e1 = first.GetEnumerator();
    var e2 = second.GetEnumerator();
    while (e1.MoveNext() & e2.MoveNext())
      yield return selector(e1.Current, e2.Current);
  }
}

Kolay gelsin :)