2012-03-14 2 views
0

У меня есть небольшая проблема с сортировкой списка с использованием реализации IComparer.Сортировка списка на вложенных членах структуры

public struct VAL 
{ 
    public int i; 
    public string s; 
} 

public struct INFO 
{ 
    public string name; 
    public VAL val; 
    public string address; 
} 

public class ListSorter:IComparer<INFO> 
{ 
    public enum SORT_TYPE{BYNAME, BYVAL,BYADDRESS}; 
    public int Compare(INFO i1, INFO i2) 
     { 
     switch(sortType) 
     { 
      case SORT_TYPE.BYNAME; 
       return string.Compare(i1.name, i2.name); 
      case SORT_TYPE.BYADDRESS: 
       return string.Compare(i1.address, i2.address); 
      case SORT_TYPE.BYVAL: 
      { 
       ?????? 
      } 
     } 
    } 
} 

Функция сравнения в классе ListSorter является примером того, как я сравнение строк в данном INFO структуре. Но я не знаю, как сортировать список, основанный на информации членов Валь STRUCT

ответ

3

Обычно вы могли бы сделать что-то вроде:

case SORT_TYPE.BYVAL: 
{ 
    int ret = i1.VAL.i.CompareTo(i2.VAL.i); 
    if (ret != 0) 
    { 
     return ret; 
    } 
    return i1.VAL.s.CompareTo(i2.VAL.s); 
} 

Вы первый сравнить i и если они равны сравнить s (или наоборот, заказ должен быть выбран вами).

+0

+1 для четкого и правильного ответа. Единственное, чего не хватает, возможно, предложить VAL реализовать IComparable и скрыть, как его участники сравнивают/имеют отдельный IComparer. kaj

+0

@KAJ. Он выбрал «внешний» сравнитель вместо «внутреннего» сравнения, поэтому я не предлагал его. – xanatos

0

Не зная, что VAL должно представлять, это почти невозможно для нас, чтобы придумать окончательный ответ на ваш вопрос. Наивная реализация выбрала бы одно поле для определения приоритетности над другим - как показал в своем ответе xanatos (и код, который он опубликовал, достигает логики, которую я включаю далее).

I.E. Какое суб-сравнение наиболее важно, это i или s? Не зная, что здесь мы можем охватить все, кроме двух комбинаций сравнений, с еще двумя «слабыми».

Следующая почти таблица может помочь вам решить, в течение двух VAL с: VAL1 и VAL2:

VAL1.i == VAL2.i 
(and) VAL1.s == VAL2.s => 0 
(or) VAL1.s < VAL2.s => -1 
(or) VAL1.s > VAL2.s => 1 
VAL1.i < VAL2.i 
(and) VAL1.s == VAL2.s => -1 //(or possibly 0 if i is not important) 
(or) VAL1.s < VAL2.s => -1 
(or) VAL1.s > VAL2.s => ??? /** WHICH ONE MAKES SENSE TO YOU? **/ 
VAL1.i > VAL2.i 
(and) VAL1.s == VAL2.s => 1 //(or possibly 0 if i is not important) 
(or) VAL1.s < VAL2.s => ??? /** WHICH ONE MAKES SENSE TO YOU? **/ 
(or) VAL1.s > VAL2.s => 1 
Смежные вопросы