[C#] Как да сортирам List?


2

Една от задачите в BgCoder иска да се сортират събития по дата и час и след това по име и локация. По-голямата част от кода е готова, но не мога да сортирам елементите. От интернет разбрах, че ми трябва delegate, но до там. Или правя всичко по грешен начин от началото?

Правя си



  1. struct Event
  2.     {
  3.         public string date;
  4.         public string title;
  5.         public string location;
  6.     }
    и после правя един List<Event>, но как сега да подредя елементите в него, според тези изисквания.

    Ето целия код - http://pastebin.com/8cUW47DQ

    Мерси много за отделеното време B)



Отговори



2

Имплементирай интерфейса IComparable:
 

class Event : IComparable
    {
        public int CompareTo(object obj)
        {
        }
    }
 
Прочети в msdn как точно става - http://msdn.microsoft.com/en-us/library/system.icomparable.aspx
По този начин Event-ите ти ще бъдат сравними и ше можеш да извикаш .Sort() метода на списъка ти.
 
edit: Само да добавя, че за тази задача, ще ти трябва много повече от List, защото операциите ти там ще са бавни и дори да я напишеш, веднага ще имаш 7-8 timeouta. Прочети за Dictionary, препоръчвам ти да погледнеш и Wintelect Power Collections ( http://powercollections.codeplex.com/ ), което е колекция от мощни структури от данни. Погледни MultiDictionary и OrderedMultiDictionary.
 
Поздрави,
Митко!

 


от d.madjarov (6820 точки)


0
Значи на изпита ще има масивно присъствие на невзет материал май... :) Ще погледна добре. Мерси за инфото :)

от KOCTEHYPKATA (5259 точки)

0
За кой изпит говориш? Това е от миналогодишния финален изпит по C# и е върху взет материал. :)

от d.madjarov (6820 точки)



2
Можеш да избегнеш IComparable в класа по следния начин:
listName.Sort( (x,y) => y.date.CompareTo(x.date) );
Като вместо date можеш да използваш всеки един от пропъртитата на класа.
Edit: Също така можеш да разгледаш и
listName.OrderBy (c => c.date).ThenBy(c => c.tittle).ThenBy(c=>c.location) , но имай предвид, че това връща нов лист, а не сортира текущия.
.....
Ако бъркам някъде, да ме поправят мастърите :) Но докато се готвих за задачата от конкурса ми се наложи да търся доста по темата и открих тази информация. IComparable може би е най-правилният начин, но ми се стори сложничко :)

от kdikov (3407 точки)


1

Ето още един вариант, който ми се струва по-лесно разбираем за начинаещ -
http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx

Накратко правиш си една функция, която получава 2 параметъра от тип Event и връща стойност int. Когато първият параметър е по-голям от втория - връщаш 1, когато са равни - 0, а когато вторият е по-голям от първия - връщаш -1. Ти определяш в кои случаи първия елемент трябва да е по-напред - например първо сравняваш по дата и само в случаите, когато датата е еднаква, сравняваш и по име и ако и те са равни - сравняваш и по локация. Винаги връщаш 1, 0 или -1.

Накрая, когато искаш да сортираш - пишеш List.Sort(име на функция). При сортирането функцията ще се извика за всеки 2 елемента и ако е нужно, ще ги размени. В линка има пример.

Поздрави

Невена


от Nevencheto (587 точки)