Soru Yeni bir tane oluşturmadan Gözlemlenebilir Bir Sıralama [çoğaltın]


Bu sorunun zaten bir cevabı var:

Yeniden sipariş vermek için aşağıdaki kodu takip ediyorum ObservableCollection<T> Toplamak:

list = new ObservableCollection<SomeType>( list.OrderBy( c=>c.Ordinal ) );

Bu kod çalışıyor, ama "yeni" nin dahil olduğu gerçeğini beğenmiyorum. İç eleman sırasını değiştirebileceğim bir yol var mı? ObservableCollection<T> yeni bir tane oluşturmadan koleksiyon?

Teşekkürler,


18
2017-10-19 21:57


Menşei


Çok kıvrımlı bir yaklaşım mevcut İşte. - Michael Todd


Cevaplar:


Verilen OrderBy Ayrıca koleksiyonunuzun boyutunu ve diğer birkaç nesneyi eşleştirmek için bir dizi haber, iki seçeneğiniz var:

  1. LINQ OrderBy'den tamamen vazgeçin ve Move yöntemini kullanarak ObservableCollection üzerinde yerinde sıralama yapan kendi türünüzü yazın.
  2. Mevcut uygulama sorunlu hale gelene kadar bekleyin, ardından 1 uygulayın.

Endişelenme, yeni şeyler doldurmak o kadar da kötü değil. Linq her zaman yapar. Bir darboğaz olmadıkça, her şey yolunda. Yerinde ayırmanın şovu gerçekten hızlandıracağına dair kanıtlar olmadıkça, burada sorun yok.


9
2017-10-19 22:17



Özellikle eşyaların kendileri yeni değil, sadece içeren koleksiyonu olduğu için. Koleksiyon nesnesinin değiştirilmesi, INPC bağlantılarının yeni siparişi yenilemesine ve göstermesine de neden olacaktır. - Monstieur
Bunu yapmayla ilgili problem, gözlemlenebilir koleksiyondaki herhangi bir gözlemciyi kaybetmenizdir. - IEatBagels
Olayları (oluşturulmuş, taşındı, kaldırıldı vb.) Kullanarak bir ObservableCollection öğesinde silinmiş veya taşınan öğeleri canlandıran bazı istemciler (Windows Mağazası uygulamaları) vardır. ObservableCollection yeniden yaratılması anlamsız! - JCKödel


Gözlemlenebilir koleksiyon için özel sıralama uzantısı yönteminizi uygulayın

 public static class ObservableCollection
 {
      public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector)
      {
          List<TSource> sortedList = source.OrderBy(keySelector).ToList();
          source.Clear();
          foreach (var sortedItem in sortedList)
          {
              source.Add(sortedItem);
          }
     }
 }

Yukarıdaki cevap, Bay Jaider'ın buna cevabından esinlenmiştir. soru


8
2017-09-25 08:32





Cevabım ilham veriyor bKK

 public static class ObservableCollection
    {
        public static void Sort<TSource, TKey>(this ObservableCollection<TSource> source, Func<TSource, TKey> keySelector, bool isAZ)
        {
            if (isAZ)
            {
                List<TSource> sortedList = source.OrderBy(keySelector).ToList();
                source.Clear();
                foreach (var sortedItem in sortedList)
                {
                    source.Add(sortedItem);
                }
            }
            else
            {
                List<TSource> sortedList = source.OrderByDescending(keySelector).ToList();
                source.Clear();
                foreach (var sortedItem in sortedList)
                {
                    source.Add(sortedItem);
                }
            }         
        }
    }

kullanım

 _someObservableCollection.Sort(x => x.Number, false); // Where number is an simple property (non-onject)

5
2017-12-09 15:17



isAZ çok sezgisel değil, ama aksi takdirde @ bkk'nin cevabı bir gelişme. +1 - James M
evet, sanırım buna derim descending, ama aksi halde büyük bir cevap. - Chase Florell


Anlayabildiğim kadarıyla, ObservableCollection koleksiyondaki öğeleri taşımak için bir yönteme sahip. T-tipi için bir karşılaştırma yapmalı ve sonra bir sıralama algoritması kullanmalısınız.


4
2017-10-19 22:04