На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Сортировка IList по ключам из string[]
    Пишу контрол... ну да не суть, что я пишу - задачка универсальная.

    Есть IList (расчет на любой юзерский List<T>). При сортировке первым делом кеширую строки: они могут добываться разными способами: через отражение полей и свойств либо событие, так что, думаю, так будет быстрее.
    Далее, как вариант, можно конвертнуть список в массив и после сортировки назад, потому как у Array есть такая версия Sort():
    ExpandedWrap disabled
      void Sort()
      {
          var values = new string[_Content.Count];
          ... // кеширование строковых значений
          var content = new object[_Content.Count];
          _Content.CopyTo(content, 0);
          Array.Sort(values, content, new StringSorter(Sorting.Order == SortOrder.Descending));
          _Content.Clear();
          for (int i = 0; i < content.Length; i++)
              _Content.Add(content[i]);
      }
       
      public class StringSorter: IComparer<string>
      {
          bool Descending;
          
          public StringSorter(bool desc)
          {
              Descending = desc;
          }
          
          public int Compare(string x, string y)
          {
              int result = string.Compare(x, y);
              return Descending ? -result : result;
          }
      }

    Но мне этот вариант не очень как-то. У IList своей сортировки нет вообще, но его принимает ArrayList.Adapter... в общем, подскажите альтернативы какие видите, будь то использование ArrayList, Linq или еще чего-то.
    Сообщение отредактировано: F.Phoenix -
      ExpandedWrap disabled
        using System.Linq;
        <...>
         
            class Program
            {
                static void Main(string[] args)
                {
                    IList<string> list = new List<string>();
                    for (char letter = 'Z'; letter >= 'A'; letter--)
                    {
                             list.Add(letter.ToString());
                    }
         
                    IList<string> orderedList = ((IList<string>)list).OrderBy(x=>x).ToList();
                    IList<string> revertedList = orderedList.OrderByDescending(x=>x).ToList();
                }
            }


      C Linq будет как-то так.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,5504 ]   [ 16 queries used ]   [ Generated: 25.04.24, 08:33 GMT ]