2009-03-18 4 views
5

Dizin sıralama yapmak için yerleşik C# desteği var mı?Dizin tabanlı bir sıralama için C# desteği var mı?

Daha Fazla Detay:
İkili bireysel listelerinde saklanan birkaç veri kümesine sahibim. Bu listeler, her zaman eşit uzunluktadır ve karşılık gelen veri öğelerini içerir, ancak bu listeler dinamik olarak gelir ve gider, bu nedenle sınıfta veya yapıdaki karşılık gelen veri öğelerini temizleyemiyorum. (Ayrıca, bazı eski sorunlar ile uğraşıyorum.)

Bu anahtarlı veri kümelerinden birini sıralayabilmem gerekir.

Bunu yapmanın en iyi yolu düşüncem, bir düzey indirgeme eklemek ve dizin tabanlı bir sıralama kullanmaktır. Bu tür yıllar boyunca kullanılmaktadır.

sıralama bazlı endeksin

Hızlı tanım:
yapmak "index", anylist[index[N]] anylist N. öğeyi verir, böylece listeleri ile aynı uzunlukta, sonra sıralama algoritması tamsayılar listesini sıralar ardışık tamsayılar dizisi sıralı olarak. Listelerin kendileri hiçbir zaman yeniden sipariş edilmez.

Dizin sıralama yapmak için yerleşik C# desteği var mı? Onu bulamadım ... bulduğum her şey koleksiyonun kendisini yeniden düzenler. Tahminim destek var ama henüz doğru yere bakmadım.

Windows altında C# .NET 3.5 kullanıyorum. Dizin dizi kurduktan sonra

cevap

12

, veri dizisindeki karşılık gelen öğeler değerlerini karşılaştıran bir özel Comparison<T> kullanarak sıralayabilirsiniz:

Array.Sort<int>(index, (a,b) => anylist[a].CompareTo(anylist[b])); 
+0

Wow! Bu harika. Tek bir satırda ihtiyacım olan şeyi yapar. Bunun Linq kullanıyor olması gerektiğini farz ediyorum. Daha önce hiç çalışmadım ve nasıl çalıştığını bilmiyorum ... tahmin etmem gerek. Teşekkürler! –

+1

Hayır, LINQ yoktur, ancak LINQ ile yaygın olarak kullanılan bir lambda ifadesi vardır. – Guffa

+2

Ve diziniz karşılaştırılabilir değilse, onun sadece 1 satır daha: Karşılaştırma karşılaştırıcı = Karşılaştırma .Default; Array.Sort (index, (a, b) => compareer.Compare (dizi [a], dizi [b])); –

0

Aşağıdaki kod bir dizinli tür achievs. Veri dizisini kopyalamak için ToArray() çağrısına dikkat edin. Gereksiz ise, veri dizisi de sıralanır.

static void Main(String[] args) 
{ 
    Int32[] data = new Int32[] { -6, 6, 5, 4, 1, 2, 3, 0, -1, -2, -3, -4, -5 }; 

    Int32[] indices = Enumerable.Range(0, data.Length).ToArray(); 

    Array.Sort(data.ToArray(), indices); 

    foreach (Int32 index in indices) 
    { 
     Console.Write(String.Format("{0} ", data[index])); 
    } 

    Console.ReadLine(); 
} 

Çıktı, en yüksek değerdedir.

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 
+0

Hayır, bu bir dizin sıralaması değil, sonuçtan bir kısmının bir dizin sıralamasının aynısı olmasına rağmen. – Guffa

+0

İndekslerdeki öğeler yeniden düzenlenmiştir, böylece veriler için [indisler [i]] 0 ile data.length arasında veri elemanlarını sıralı olarak verir. Bir dizin sıralaması budur. –

+0

Yapılma şeklinin gerçekten akıllı olmadığını itiraf ediyorum çünkü endeksler verilerin bir kopyasını sıralayarak sıralanıyor. Veri öğeleri büyükse sonuç aynıdır ancak çözümünüzle karşılaştırıldığında pahalıdır. –