Lambda/Linq kullanarak bir listeyi nesnelere göre sıralama
Bir dize içinde "sort by özelliğinin" adı var. Nesne listesini sıralamak için Lambda/Linq kullanmam gerekecek.
Ex:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
- Alan adını kontrol etmek için bir grup if kullanmak yerine (sortBy), sıralama yapmanın daha temiz bir yolu var mı
- Sıralama veri türünün farkında mı?
263
3
Yapabileceğiniz bir şey
Sort
u lambdaları daha iyi kullanacak şekilde değiştirmektir.Artık
Sort
yöntemini çağırırken sıralanacak alanı belirtebilirsiniz.Özelliğin değerini almak için Reflection kullanabilirsiniz.
TypeHelper'ın aşağıdaki gibi statik bir yöntemi vardır:
Ayrıca VS2008 Örnekleri kütüphanesi'deki Dinamik LINQ'ya da bakmak isteyebilirsiniz. Listeyi bir IQueryable olarak dökmek için IEnumerable uzantısını kullanabilir ve ardından Dynamic link OrderBy uzantısını kullanabilirsiniz.
1. için cevap:
Adı bir dize olarak kullanarak OrderBy öğesine aktarılabilecek bir ifade ağacını manuel olarak oluşturabilmeniz gerekir. Ya da başka bir yanıtta önerildiği gibi yansıma kullanabilirsiniz, bu daha az uğraştırıcı olabilir.
Edit: İşte manuel olarak bir ifade ağacı oluşturmanın çalışan bir örneği. (Özelliğin yalnızca "Value" adını bilirken X.Value üzerinde sıralama). Bunu yapmak için genel bir yöntem oluşturabilirsiniz (oluşturmalısınız).
Ancak bir ifade ağacı oluşturmak, ilgili türleri bilmenizi gerektirir. Bu, sizin kullanım senaryonuzda bir sorun olabilir ya da olmayabilir. Eğer hangi tipe göre sıralama yapacağınızı bilmiyorsanız, yansıma kullanmak muhtemelen daha kolay olacaktır.
2. için cevap:
Evet, çünkü Comparer.Default, karşılaştırıcıyı açıkça tanımlamazsanız karşılaştırma için kullanılacaktır.