Soru C #: Anonim işlevle sıralama


Diyelim ki bir nesne listesi var ve bunu DateModified özelliği ile sıralamak istiyorum. Neden böyle bir temsilci kullanamıyorum? Bunları aşağıda gösterildiği şekilde DateModified ile nasıl sıralamalıyım?

public string SortByDateModified(List<CartItem> items)
{
    items.Sort(new Func<CartItem, CartItem, bool>((itemA, itemB) =>
    {
        return itemA.DateModified < itemB.DateModified;
    }));
}

23
2018-01-23 03:42


Menşei


Demo amaçlı işlevi kısaltdığınızı var mı? Çünkü bir ipi döndürmesi gerekiyor ama hiçbir şey döndürmüyor. - Michael Stum♦
Bir yanlış cevap seçme zamanı :) - Skurmedel


Cevaplar:


Neden bir lambda ifadesi kullanmıyorsunuz?

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified)); 
} 

51
2018-01-23 04:01



Kesinlikle. Jeff'in cevabı doğru, fakat iğrenç. Bir lambda çok daha temiz. - Aaronaught
Bir küçük not, bir cevapsız ) :) - Skurmedel
Skurmedel, teşekkürler, cevabı düzenledim. - Samuel Neff
Bu uyarı ile - Net 3.5 veya daha büyük hedeflemeniz gerekir. Uyumluluk nedeniyle 2.0'ı hedefliyorsanız, temsilci cevabı kullanılmalıdır. - Spain Train
Tercih soru. Bazı geliştiriciler lambda ifadelerini sevmezler. - Karlth


Lambda kullanmak istemiyorsanız veya .NET 2.0'dan büyükse, şunu kullanın:

public string SortByDateModified(List<CartItem> items) 
{ 
    items.Sort(delegate(CartItem itemA, CartItem itemB) 
    { 
        return itemA.DateModified.CompareTo(itemB.DateModified); 
    }); 
} 

Tecrübemde, Unity, lambda ve hatta delegeler gibi ortamlarda özellikle iOS gibi platformlarda çökmelere veya sorunlara neden olabilir. Bu durumda, sıralayıcınızı şöyle bir işlev yapmak istersiniz:

int SortCartItemFunction(CartItem itemA, CartItem itemB) 
{ 
    return itemA.DateModified.CompareTo(itemB.DateModified); 
} 

O zaman bunu şöyle sıralayabilirsin:

items.Sort(SortCartItemFunction);

14
2018-01-23 03:53



1+ oylama sınırına ulaşıldı :( - Skurmedel


Sort yöntem çağrılan bir temsilci alır Comparison<T>. Sen geçmeye çalışıyorsun Func<int, int, bool>Kendisi bir delege olan. Temsilci arasında dönüşüm yok Func<int, int, bool> ve delege Comparison<T>.

Bununla birlikte, lambda ifadesi.

items.Sort((a, b) => a.DateModified.CompareTo(b.DateModified));

Gerçekten de, bu çok lambda ifadesini kullanıyorsunuz ve Func<int, int, bool> Yapıcı *. Ancak, ihtiyaç yoktur. Bir lambda ifadesi, kimin imza eşleştiği herhangi bir delege dönüştürülebilir - yani (a, b) => a.DateModified.CompareTo(b.DateModified) yazılan bir şeye atanabilir Func<int, int, int> veya yazılan bir şey Comparison<T>. Bu durumda, bir Comparison<T>.

* Bir küçük ayar ile. Sıralama, bir tamsayı bir dönüş türü olarak bekler. Negatif değerler daha azını gösterir, 0 eşittir ve pozitif değerler daha büyük gösterir.


11
2018-01-23 04:29





bool genellikle böyle bir delege içinde yararlı değildir int Karşılaştırma sonuçlarını göstermek için 3 değere ihtiyacınız olduğundan, daha küçük, eşit ve büyüktür. .NET koleksiyonları genellikle (her zaman değilse) -1 değerinin altında olması anlamına gelir, 0 eşit demektir ve 1 daha büyük demektir.

Daha sonra, temsilcinizde, x değerinin daha az, eşit ya da y değerinden daha büyük olup olmadığını kontrol etmelisiniz. Burada dikkat edilmesi gereken ilginç bir nokta, eğer sonuçları çevirirseniz, örneğin y'yi x ile karşılaştırmanızın tersi yönde sıralayacağınızdır.

Tarihleri ​​ayırmanın en kolay yolu için JohnC'nin cevabıveya Sam.


0
2018-01-23 03:58