2010-03-24 11 views
5

: önceliğe göre bana sıralama listesi olanak verenlistesi <> öğesi nerede olduğunu bir listesi var kendi karşılaştırıcısı

struct element { 
       double priority; 
       int value; 
       } 

Nasıl kendi karşılaştırıcısı uygulayabilir? Ben SortredList ile deneyin ... ama douplicated anahtarları izin vermez :(yardım

büyük teşekkür

+0

programlama dili? –

+0

C#? Java? Ne lang? –

+2

muhtemelen C#, <> genel/şablon sözdizimi nedeniyle, C++ tam olarak 'List' adlı yerleşik bir öğeye sahip değildir ve Java ArrayList'i tercih eder. –

cevap

3

: Eğer eski okul temsilci sözdizimi için lambda takas gerekir C# eski sürümleri için

yourList.Sort((x, y) => x.priority.CompareTo(y.priority)); 

: bir Comparison<T> temsilci alır Sort overload C# 3 uzantılar veya Lambda'lar o zaman yapı aynen böyle IComparable arabirimini uygulamak olabilir:

struct element : IComparable 
{ 
    double priority; 
    int value; 
    public element(int val, double prio) 
    { 
     priority = prio; 
     value = val; 
    } 
    #region IComparable Members 

    public int CompareTo(object obj) 
    { 
     // throws exception if type is wrong 
     element other = (element)obj; 
     return priority.CompareTo(other.priority); 
    } 

    #endregion 
} 

ayrıcavardır Bu arayüzün, ama o arayüz List<> üzerinde Sort yöntemini çağırarak, sizin yapı veya sınıf üzerine uyguladıktan sonra prensip aynı

geçecek olmasına eğer

static void Main(string[] args) 
{ 
    Random r = new Random(); 
    List<element> myList = new List<element>(); 
    for (int i = 0; i < 10; i++) 
     myList.Add(new element(r.Next(), r.NextDouble())); 
    // List is now unsorted 
    myList.Sort(); 
    // List is now sorted by priority 
    Console.ReadLine(); 
} 
+0

2.0 olsa bile anonim yöntem yaklaşımı kullanabilirsiniz. –

+0

Harika bir uygulama! Kullanım örneği için teşekkürler;) İhtiyacım olan bu! :) – netmajor

+0

Marc: evet, haklısın. Bu yaklaşımın bir yararı olsa da, bir kişinin 'element'ler koleksiyonunu sıralaması gereken her yer için otomatik olarak çalışmasıdır. –

11

sonra varsayarsak C# 3 veya:! Listeyi sıralamak isterseniz

var sorted = MyList.OrderBy(e => e.priority); 
+0

Bunun, varolan "Liste <>" yerinde sıralamak yerine, yeni bir "IEnumerable <>" döndüreceğine işaret eden değer. – LukeH

+1

Bu listeyi sıralamayacağına dikkat edin, yinelendiğinde sıralı bir liste öğesini öğe ile döndürecektir. – Blindy

+0

Toplamayı manipüle eden ve sonucu kaydeden Sıralama yöntemini düşünüyorum. Ama bunun için de Tnx! Takdir Ediyorum Yardımınız :) – netmajor

1

yeni bir örneğini oluşturmadan, sen IComparer uygulayabilirsiniz kendisi, o zaman sen kullanarak bir yerinde tür gerçekleştirebilir uygulamanızda

public class ElementComparer : IComparer<element> 
{ 
    public int Compare(element x, element y) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+1

... ile yeni NotImplementedException(); 'yerine x.priority.CompareTo (y.priority);'! :) – gehho

+0

gehho yorumsuz Cevabınız kısmi .. – netmajor

8

örneği ile List.Sort çağrı güvenebileceğiniz yapamıyorsanız

yourList.Sort(
    delegate(element x, element y) { return x.priority.CompareTo(y.priority); }); 
+0

Bu iki okullu bir sıralama örneği takdir ediyorum! – netmajor

+0

Lamda önerisini işe alamıyorum? Ben 3.5 kullanıyorum, bu sembolü çözmek olamaz diyorToTo – Robs

+1

Lucifer: Muhtemelen 'öncelikli' nedeniyle 'element' struct özel bir üyesi olmak –

2

Bu bağlıdır "Sadece çalışmak" listenin kendisini sıralamak veya değerleri sıralanmış sırayla almak (listeyi değiştirmeden).

listeyi kendisi sıralamak için (bir List<element> denilen elements var varsayarak):

elements.Sort((x, y) => x.priority.CompareTo(y.priority)); 
// now elements is sorted 

.NET 2.0 eşdeğeri:

elements.Sort(
    delegate(element x, element y) { 
     return x.priority.CompareTo(y.priority); 
    } 
); 

sıralı düzende değerlerini almak için:

var orderedElements = elements.OrderBy(x => x.priority); 
// elements remains the same, but orderedElements will retrieve them in order 

.NET 2.0'da LINQ eşdeğeri yok, ancak kendiniz yazabilirsiniz:

public static IEnumerable<T> OrderBy<T>(IEnumerable<T> source, Comparison<T> comparison) { 
    List<T> copy = new List<T>(source); 
    copy.Sort(comparison); 

    foreach (T item in copy) 
     yield return item; 
} 

Kullanımı:

Comparison<element> compareByPriority = delegate(element x, element y) { 
    return x.priority.CompareTo(y.priority); 
}; 

// unfortunately .NET 2.0 doesn't support extension methods, so this has to be 
// expressed as a regular static method 
IEnumerable<element> orderedElements = OrderBy(elements, compareByPriority); 
+0

Tüm cevapların güzel derlemesi: P – netmajor

İlgili konular