2009-07-02 15 views
7

kimse ben gibi genel bir listesi var .. yardım edebilir böyleceBir Listeyi <> başka bir Listede (C#) saklanan özel siparişimle mi sıralama?

IList<itemTp> itemTps; 

itemTp temelde sınıf ve bu konuda bir özellik olan "kod"

ben olmak gerekir: (a özelliklerin numarası vardır) 'dir başka bir Listede belirlediğim belirli bir siparişi sıralayabiliyor.

Bu liste böyle demek (birinciden sonuncuya doğru başlayarak) sırasını listeleyen basit bir listedir

code1 code3 code2 code5 (o 2 ila 5 için 1 ile 3 arasında gider fark - bunlar isimler, bir şey çağrılabilirler. önemli olan sipariş, sayılarla ilgisi yok)

Temel olarak itemTp öğelerindeki öğelerin diğer listedeki öğelere göre olmasını sağlamalıyım ...

Yani hayal benim IList bu code1, code2, code3, code5 gibi - bu yüzden sıralama içinde bittikten sonra benim

 IList<itemTp> 

sırayla ve code1, code3, code2, code5 gibi özelliği vardır 4 sınıfları içerecektir (sipariş değişimi)

Nasıl yapılacağı hakkında herhangi bir fikrin var mı? yanlış bir şey varsa

cevap

9

Öğeleri, diğer listenizin durumuna göre karşılaştıracak bir IComparer oluşturmanız gerekir. Bir IComparer kullanmanın avantajı, bu optimizasyona ihtiyacınız olduğunda tekrarlanan IndexOf() aramalarını önlemek için sınıfınıza önbellekleme mantığı oluşturabileceksiniz. Ayrıca, uygun olduğunda kullanılabilecek çoklu "diğer" listeleri de koruyabileceksiniz.

class ItemTpComparer : IComparer<itemTp> 
{ 
    private IList<codeTp> otherList; 

    public ItemTpComparer(IList<codeTp> otherList) 
    { 
     this.otherList = otherList; 
    } 

    public int Compare(itemTp a, itemTp b) 
    { 
     return otherList.IndexOf(a.Code) - otherList.IndexOf(b.Code); 
    } 
} 

Ve sıralamayı gerçekleştirmek için: Nesneler C# 3 ve Entities kullanarak

myList.Sort(new ItemTpComparer(otherList)); 
+0

Bir avantaj olduğunu söyleyemem. Temsilci, arabirimi geçirdiğiniz gibi bir örnek yöntemine iletebilir ve orada istediğiniz herhangi bir mantığa sahip olabilirsiniz. – Groo

+0

Bu harika görünüyor, sadece bir soru, sen a ve b IndexL'ye geçiyorsun, eğer ... "TestMeNow" ve "TestMeLater" olsaydı ne olurdu? Indexof her biri için 6'ya geri dönecek? –

+0

Yorumunuzu anlamıyorum. TestMeNow ve TestMeLater diğer listede bulunuyorsa, her ikisi de dizin 6'da olamaz. – anthony

0

Üzgünüm, burada yüklenmiş bir C# editörü yok, ama böyle bir şey:

Array.Sort(
    itemTps, 
    delegate(ItemTp a, ItemTp b) 
    { 
      return secondList.IndexOf(a.Code) - secondList.IndexOf(b.Code); 
    }); 

Not: en etkili yolu olmayabilir ve aynı zamanda hiçbir yoktur ikinci listenin hiç Kod içerip içermediğini kontrol etmek.

Mehrdad söyleyen gibi, Array.Sort jenerik IList<T> için çalışmıyor [Düzenle]. Diziyi yerinde sıralamak için, sarıcı oluşturmak için ArrayList.Adapter yöntemini kullanmanız ve sonra da onu sıralamanız gerekir. ArrayList.Sort bir delege karşılaştırmasını desteklemediğinden, anonim temsilci IComparer<T>, uygulamasının içine koymanız gerekir.

Ayrı bir listede sıralamanız gerekiyorsa, önce bir dizi oluşturarak yukarıdaki mantığı kullanmak mantıklı olabilir.

+0

Dizi.Sıralama, genel IList

+0

Yep'te çalışmayacaktır. Sadece karşılaştırmayı düşünüyordum. İşte burada: http://stackoverflow.com/questions/15486/sorting-an-ilist-in-c – Groo

0

, sadece yerine sıralamak için mevcut olanı çalışmakla yeni bir liste oluşturmak olacaktır:

void Example() 
{ 
    IList<string> codes; 
    IList<ItemTp> itemTps; 
    itemTps = codes.Select(code => itemTps.Single(itp => itp.Code == code)).ToList(); 
} 
İlgili konular