2013-07-02 30 views
11

C# içinde özel bir dize IComparer uygulamak ve bir ComboBox'a uygulamak istiyorum.Özel dize karşılaştırma C#

Gerçek Sonuçlar

Ben true için ComboBox 'ın Sorted özelliği ayarlamak, çıkış geçerli:

A 
AA 
AAA 
B 
BB 
BBB 

Sonucu

sıralama algoritması istenilen davranışı Aranıyor aşağıdaki (finansal geliştiriciler nedenini anlayacaktır :)):

AAA 
AA 
A 
BBB 
BB 
B 

Soru

bunu yapmak mümkün mü? Sıralama algoritmaları burada gerekli mi?

PS: Ben kodu ile tam bir cevap gerekmez, sadece bunun nasıl yapılabileceğini bir fikir .. Bu kredi değerlendirmesi hakkındadır

DÜZENLEMEYİ

gerekir. Soruma bir şey atladım. derecelendirme bu düzende sıralanmış edilmelidir:

X in ('A','B','C') ile
XXX 
XX+ 
XX 
XX- 
X+ 
X 
X- 

ve 'A' > 'B' > 'C'

+2

msgstr "msgstr" msgstr "msgstr" msgstr "msgstr" "" . Bence en iyi bahisteki unsurlar doğru sırada _insert_. (Hangi, eğer örneğin numaralandırılırsa, öğeleri koleksiyonunda OrderBy'yi arayarak yapabilirsiniz). –

+0

Listeyi alt listelere ayırmak ve alt listeleri uzunluğa göre sıralamak bir seçenek olabilir. – jAC

+0

Durumunuza bağlı olarak, iş katmanınızda veya sunum katmanınızda herhangi bir özel sipariş vermelisiniz. –

cevap

2

varsayarsak bu krediden içindir derecelendirmeler, normalde bu, açılır listenin veri kaynağı olarak atamadan önce listeyi sıralamak için kullanabileceğiniz CreditRating sınıfında bir "sıralama düzeni" sütununa sahip olarak yapılır.

if(left[0] != right[0]) 
    return left[0].CompareTo(right[0]); 
else 
    return right.Length - left.Length; 

başka bir geçici çözüm İsterseniz daha fazla kontrol:

Fakat, (belirli olası değerlere dayalı) hızlı bir geçici çözüm dize azalan uzunluğuyla sonra, ilk harf artan göre sıralamak olurdu sipariş listesini sıralamak için "doğru" amacıyla olası değerler listesi oluşturabilir ve ardından bu kullanmaktır üzerinde: İşte

public class MyComparer : IComparer<string> 
{ 
    private static readonly string[] Ratings = new [] { 
     "CC","C","CCC-","CCC","CCC+", 
     "B-","B","B+","BB-","BB","BB+","BBB-","BBB","BBB+", 
     "A-","A","A+","AA-","AA","AA+","AAA"}; 
    // reverse the order so that any strings not found will be put at the end. 

    public int Compare(string left, string right) 
    { 
     return Array.IndexOf(Ratings, right).CompareTo(Array.IndexOf(Ratings, left)); 
    } 
} 
+1

Bu, verilen veriler için çalışırken, ABB'yi "AA" ile düzgün bir şekilde sıralamaz. 'AA' önce gitmeli, ama kodunla ikinci olur. Eşleşmeyen bir eşleşme veya sonuna ulaşana kadar her iki dizede her karakterden geçmeniz gerekir, * sonra uzunlukları karşılaştırın. Sadece ilk karakteri karşılaştıramazsın. – Servy

+1

@Servy bu yüzden değerlerin kredi notu olduğu varsayımıyla kalifiye oldum. ABB, geçerli bir kredi derecelendirmesi değil. –

+0

Cevabınız @DStanley için teşekkürler. Bu gerçekten kredi notları içindir. Ancak, sorduğum soruya bir şey atlamamıştım. Bu, '+' veya '-' ile biten oranlardır. Algoritmanınızı ilk başta düşündüm ama son sözümü aklımda tutarak daha karmaşık hale geliyor. – Fares

0

o dizeleri alır ama karakter başına karşılaştırır, böylece IComparer yaz,

if A[0] == B[0] go to the next character. 
if B[1] == null or A[1] < B[1], return A < B. 
if A[1] == null or B[1] < A[1], return B < A. 
if equal...continue as needed 
6

olan bir çoğunlukla uygulanan versiyon:

public class MyComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     //todo null checks on input 

     var pairs = x.Zip(y, (a, b) => new { x = a, y = b }); 

     foreach (var pair in pairs) 
     { 
      int value = pair.x.CompareTo(pair.y); 
      if (value != 0) 
       return value; 
     } 


     //if we got here then either they are the same, 
     //or one starts with the other 
     return y.Length.CompareTo(x.Length); //note x and y are reversed here 
    } 
} 

Bu, Zip kullanır ve her biri karşılık gelen dizgeden çiftler elde edinceye kadar eşittir. Geçmişi yaparsa bir dizge diğeriyle başlar. Geleneksel bir dizgi karşılaştırması için, uzunlukları sadece giriş parametreleriyle aynı sırayla karşılaştırırdık. Siparişi esasen uzunluğa göre tersine çevirdiğimizden, x ve y'un son satırda değiştirildiğini unutmayın. Bu karşılaştırma mantığını tersine çevirir.

+0

['Sorted' özelliği] (http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.sorted) 'den bahsettiği için, kahramanın bir Windows Forms ComboBox'ı var gibi görünüyor. aspx). Bu doküman sayfasında, sıralama alfabetik olarak yazıyor. Öyleyse soru, (ayrıca) onun birleşik kutusunu, karşılaştırıcısını kullanmak için nasıl ayarlayabileceğidir. Belki onun açılan kutusunda "ürün" için dizeleri kullanamaz? (System.Windows.Forms.ComboBox'un tüm ayrıntılarını hatırlamıyorum.) –

+0

@JeppeStigNielsen OP, belirtilen mantığı uygulayan IComparer uygulamasının özellikle uygulanmasını istedi. Eğer o karşılaştırıcıyı kendi özel durumuna nasıl uygulayacağından emin değil (ve bu problemin olduğuna dair hiçbir belirti vermedi), o zaman bu dürüstçe farklı bir soru olurdu. Özel bir karşılaştırma yapmanın zor olduğunu biliyor ve bir yorumda bunu nasıl yapacağınızı/açıklamak istediğinizi varsa, o zaman tüm yollarla. – Servy

+0

@Servy cevabınız için teşekkür ederiz.Gönderiyi yukarıda düzenledim ve eklediklerimi akılda tutarak algoritmanızın verimsiz olduğu görülüyor. – Fares