2011-08-12 24 views
9

Belirli bir siparişe göre Linq'den sipariş vermek mümkün mü?Özel Sipariş Linq - SQL Sırasıyla

List<bbHeader> bb = new List<bbHeader>(); 
bb.OrderBy(x => x.Country.CompareTo(new string[]{"AR","CL","PY","UY","AUP"})); 

fikri gibi şey Ülke alanı bu durumda

cevap

16

sizin örnekte çok doğrudan yolu var. Unutmayın ki, bulunmayan öğeler -1, sizin için de düzeltebileceksiniz.

Daha karmaşık bir şey yapmak isterseniz, özel siparişinizi kullanarak öğeleri karşılaştırmak için kendi özel IComparer sınıf uygulamanızı oluşturabilirsiniz. Bu daha sonra OrderBy'ye geçirilebilir.

bir IComparer gibi görünecektir Böyle:

public sealed class SequenceComparer : IComparer<string> 
{ 
    private string[] _sequence { get; set; } 

    public SequenceComparer(string[] sequence) 
    { 
     if (sequence == null) throw new ArgumentNullException("sequence"); 

     _sequence = sequence; 
    } 

    public int Compare(string x, string y) 
    { 
     if (ReferenceEquals(x, y)) return 0; 

     return Array.IndexOf(_sequence, x).CompareTo(Array.IndexOf(_sequence, y)); 
    } 
} 

Ve gibi çağrılabilir: Her iki şekilde iyi çalışıyor

var result = bb.OrderBy(x => x.Country, new SequenceComparer(new [] { "AR", "CL", "PY", "UY", "AUP" })); 

, ikincisi güzel ve yeniden kullanılabilir, ancak eski olduğu (doğrudan IndexOf kullanarak) hala çok özlü. Senin seçimin.

+0

Bu konuda okuyabileceğim bir yer önerebilir misin? – Guillermo

+0

@Guillermo: sadece Array.IndexOf() –

+0

Great kullanarak çok doğrudan bir şekilde benim örnek düzenlenmiş, ben Array.IndexOf 'hilesi için – Guillermo

1

de işlevi orderBy için kendi temsilci geçebilir dize ve karşılaştırma mantığının belirli sırasına göre sıralı olmasıdır can sizin tarafınızdan tanımlanmalıdır. Bu şekilde

var sequence = new [] { "AR", "CL", "PY", "UY", "AUP" }; 

List<bbHeader> bb = new List<bbHeadher>(); 

// fill bb 

// takes the item, checks the index of the country in the array 
var result = bb.OrderBy(x => Array.IndexOf(sequence, x.Country)); 

, sen endeksi Ülkeye Göre sipariş dizisi dizede bulunur: