Bazen indeksleme lüksüne sahip değilsiniz ya da belki bir Linq sorgusunun sonuçlarını tersine çevirmek istiyorsunuz ya da belki kaynak koleksiyonunu değiştirmek istemiyorsunuz, bunlardan herhangi biri doğruysa, Linq size yardımcı olabilir.
Linq OrderByDescending için bir sıralama anahtarı sağlamak üzere Linq Select ile anonim türleri kullanan bir Linq genişletme yöntemi;
public static IEnumerable<T> Invert<T>(this IEnumerable<T> source)
{
var transform = source.Select(
(o, i) => new
{
Index = i,
Object = o
});
return transform.OrderByDescending(o => o.Index)
.Select(o => o.Object);
}
Kullanımı:
var eable = new[]{ "a", "b", "c" };
foreach(var o in eable.Invert())
{
Console.WriteLine(o);
}
// "c", "b", "a"
"Tersine Çevir" olarak adlandırılmıştır çünkü "Tersine Çevir" ile eşanlamlıdır ve Ters Liste uygulamasıyla belirsizliği gidermeyi etkinleştirir.
Bir koleksiyonun belirli aralıklarını tersine çevirmek de mümkündür, çünkü Int32.MinValue ve Int32.MaxValue herhangi bir koleksiyon indeksinin aralığının dışında olduğundan, sipariş süreci için bunları kullanabiliriz; bir öğe dizini verilen aralığın altındaysa, buna Int32.MaxValue atanır, böylece OrderByDescending kullanılırken sırası değişmez, benzer şekilde, verilen aralıktan daha büyük bir dizindeki öğelere Int32.MinValue atanır, böylece bunlar sipariş sürecinin sonunda görünür. Verilen aralıktaki tüm öğelere normal indeksleri atanır ve buna göre tersine çevrilir.
public static IEnumerable<T> Invert<T>(this IEnumerable<T> source, int index, int count)
{
var transform = source.Select(
(o, i) => new
{
Index = i < index ? Int32.MaxValue : i >= index + count ? Int32.MinValue : i,
Object = o
});
return transform.OrderByDescending(o => o.Index)
.Select(o => o.Object);
}
Kullanımı:
var eable = new[]{ "a", "b", "c", "d" };
foreach(var o in eable.Invert(1, 2))
{
Console.WriteLine(o);
}
// "a", "c", "b", "d"
Bir koleksiyonu tersine çevirmek için geçici bir Liste kullanmak yerine bu Linq uygulamalarının performans vuruşlarından emin değilim.
Yazarken, Linq'in kendi Reverse uygulamasından haberdar değildim, yine de bunu çalışmak eğlenceliydi.
https://msdn.microsoft.com/en-us/library/vstudio/bb358497(v=vs.100).aspx