Soru LINQ ile C # listesinde sırala


C # 'da bir liste sıralamak istiyorum.

Yapının özelliği AVC'nin gerçek olduğu yere geldiği gibi, önce onları gösterin, sonra AVC yanlışlara gider. C # LINQ içinde bunu yapmak için herhangi bir yolu var mı?


44
2017-10-23 11:57


Menşei




Cevaplar:


Eh, LINQ kullanarak en basit yolu şöyle bir şey olurdu:

list = list.OrderBy(x => x.AVC ? 0 : 1)
           .ToList();

veya

list = list.OrderByDescending(x => x.AVC)
           .ToList();

ben inanmak doğal sipariş bool değerler false < trueama ilk form daha açık IMO yapar, çünkü herkes bilir ki 0 < 1.

Bunun orijinal listenin kendisini sıralamayacağını unutmayın - yeni bir liste oluşturacak ve referansı tekrar atayacaktır. list değişken. Yerine göre sıralamak istiyorsanız, List<T>.Sort yöntem.


96
2017-10-23 12:01



.ToList () burada mı gerekli? - Krishna P S
@KrishnaPS: Evet, derleme zamanı türünü varsayarak list olduğu List<T>. Aksi takdirde bir IEnumerable<T> bir LIst<T> değişken. Gerçi, her seferinde üzerinde yinelediğiniz her zaman tembel olarak değerlendirilecek bir diziye ihtiyacınız varsa, buna ihtiyacınız yoktur. - Jon Skeet
.Teşekkür ederim! Yani sipariş, tembel olarak değerlendirilen bir liste döndürür mü? Burada bir şey mi eksik? Üzgünüm, kafam karıştı mı? Listeyi sipariş ettiğim ve yukarıdaki gibi IEnumerable olarak döndürdüğüm bir durumla karşı karşıyayım, ancak bir değeri değiştirmek için her bir liste için bir yaptığım zaman, siparişin kesintiye uğradığını görüyorum .. - Krishna P S
@KrishnaPS: OrderBy bir döndürür sıra, bir liste değil. Yine de probleminizi gösteren yeni bir soru sormanız gerektiği gibi geliyor. - Jon Skeet
Lütfen gönderdiğim bu soruya bana yardımcı olun stackoverflow.com/questions/41738008/... - Krishna P S


Bunun gibi?

LINQ’da:

var sortedList = originalList.OrderBy(foo => !foo.AVC)
                             .ToList();

Ya da yerinde:

originalList.Sort((foo1, foo2) => foo2.AVC.CompareTo(foo1.AVC));

Jon Skeet'in dediği gibi, buradaki hile bilerek false 'küçük' olarak kabul edilir true.

Bu sipariş işlemlerini kodunuzda çok farklı yerlerde yapıyorsanız, türünüzü almak isteyebilirsiniz. Foo uygulamak IComparable<Foo> ve IComparable arabirimleri.


17
2017-10-23 12:02





AVC'nin aynı olduğu tüm öğeler arasında tutarlı bir sıralama elde etmek için başka bir şeye göre sıralanmasını istediğinizi kabul ediyorum. Örneğin isme göre:

var sortedList = list.OrderBy(x => c.AVC).ThenBy(x => x.Name).ToList();

9
2017-10-23 12:10