locked
Как отсортировать список глобально? (для ListBox) RRS feed

  • Вопрос

  • вопрос в следующем - есть неотсортированный список такого плана

     

    public class Book
            {
                public string Name { get; set; }
                public string Color { get; set; }
            }
    
    public class Books : List<Book>
            {
                public Books()
            {
                    Add(new Station { Name = "", Color = "" });
                    Add(new Station { Name = "", Color = "" });
            }
    


     

    есть метод, который сортирует этот список и обновляет ListBox приблизительно так:

     

    Books list = new Books();
    var sortedlist = from p in list
                                orderby p.Name 
                                select p;
                listbox1.ItemsSource = sortedlist;
    

    этот метод запускается по нажатию кнопки, но, поскольку есть неприятная задержка, мне нужно отсортировать этот список где-нибудь отдельно в глобальную переменную и просто брать из неё этот список. как это сделать?

     



    • Изменено K_K 16 января 2012 г. 13:32
    16 января 2012 г. 13:17

Ответы

  • > написал sortedlist = (from p in list orderby p.Name select p).ToList(); в конструктор MainPage - производительность при первом нажатии такая же, как при вызове метода сортировки...
     
     
    сортировку можно выполнить в отдельном потоке.
    примерно так:
     

    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Windows.Controls;
    
    namespace SilverlightApplication4
    {
        public partial class MainPage : UserControl
        {
            public IEnumerable<Item> SortedList
            {
                get
                {
                    _SortedListEvent.WaitOne();
                    return _SortedList;
                }
                private set
                {
                    _SortedList = value;
                }
            }
            IEnumerable<Item> _SortedList;
            ManualResetEvent _SortedListEvent;
    
            public MainPage()
            {
                InitializeComponent();
                _ListEvent = new ManualResetEvent(false);
                ThreadPool.QueueUserWorkItem(_ =>
                {
                    _SortedList = (from p in list orderby p.Name select p).ToList();
                    _SortedListEvent.Set();
                });
            }
        }
    }
    
    

     

    • Помечено в качестве ответа K_K 16 января 2012 г. 17:30
    16 января 2012 г. 14:10

Все ответы

  • > мне нужно отсортировать этот список где-нибудь отдельно в глобальную переменную

     

    IEnumerable sortedlist;
    ...
    sortedlist = (from p in list orderby p.Name select p).ToList();
    

     

    • Изменено Malobukv 16 января 2012 г. 13:33
    • Помечено в качестве ответа K_K 16 января 2012 г. 13:51
    • Снята пометка об ответе K_K 16 января 2012 г. 13:53
    16 января 2012 г. 13:32
  • > мне нужно отсортировать этот список где-нибудь отдельно в глобальную переменную

     

    IEnumerable sortedlist;
    ...
    sortedlist = (<span style="color:blue">from</span> p <span style="color:blue">in</span> list <span style="color:blue">orderby</span> p.Name <span style="color:blue">select</span> p).ToList();
    
    

     

    где конкретно мне это сделать, что бы в обработчике кнопки я мог написать

    listbox1.ItemsSource = sortedlist;
    

    ??

    16 января 2012 г. 13:48
  • ха...вопрос снят, оказывается я не знаю чем отличается объявление до конструктора MainPage  и после...
    16 января 2012 г. 13:51
  • черт.. 

    написал sortedlist = (from p in list orderby p.Name select p).ToList();  в конструктор MainPage - производительность при первом нажатии такая же, как при вызове метода сортировки...

    16 января 2012 г. 13:54
  • > написал sortedlist = (from p in list orderby p.Name select p).ToList(); в конструктор MainPage - производительность при первом нажатии такая же, как при вызове метода сортировки...
     
     
    сортировку можно выполнить в отдельном потоке.
    примерно так:
     

    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Windows.Controls;
    
    namespace SilverlightApplication4
    {
        public partial class MainPage : UserControl
        {
            public IEnumerable<Item> SortedList
            {
                get
                {
                    _SortedListEvent.WaitOne();
                    return _SortedList;
                }
                private set
                {
                    _SortedList = value;
                }
            }
            IEnumerable<Item> _SortedList;
            ManualResetEvent _SortedListEvent;
    
            public MainPage()
            {
                InitializeComponent();
                _ListEvent = new ManualResetEvent(false);
                ThreadPool.QueueUserWorkItem(_ =>
                {
                    _SortedList = (from p in list orderby p.Name select p).ToList();
                    _SortedListEvent.Set();
                });
            }
        }
    }
    
    

     

    • Помечено в качестве ответа K_K 16 января 2012 г. 17:30
    16 января 2012 г. 14:10