2012-03-14 64 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比較函數是我比較如何在給定的信息結構串的例子。但我不知道如何根據該VAL結構信息會員

回答

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 2012-03-14 08:35:43

+0

@KAJ他選擇了一個「外部」比較,而不是「內部」比較,所以我沒有建議它。 – xanatos 2012-03-14 08:37:52

0

不知道VAL應該代表什麼,這幾乎是不可能的,因爲我們無法爲您的問題提出明確的答案。一個天真的實現會選擇一個領域來優先於另一個領域 - 就像xanatos在他的回答中所展示的(並且他在那裏發佈的代碼實現了我進一步包含的邏輯)。

I.E.哪個子比較最重要,是i還是s?我們不知道在這裏我們可以覆蓋除了2個比較組合之外的所有其他組合,而另外2個比較脆弱。

下幾乎表可幫助您確定,兩個VAL S:VAL1VAL2

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