2011-08-12 45 views
0

我有對象的列表,我需要通過他們的ID是在格式.NET IComparable的:如何實現

x~x~x~x~x~x~x~x 

例如對它們進行排序

"something~XXX~XXX~XXX~XXX~XXX~OTHER~XXX" 
"something~XsdXX~XXX~XfdXX~XXX~XXX~OTHER~XXX" 
"Detail~XXX~~XdfXX~XXX~XXX~OTHER~XXX" 
"x~x~~~~~x~x" 

我需要通過每個蒂爾達和排序之間的每個字符串進行排序。所以首先我想把字符串放到第一個字符串上,然後按字符串排序。然後,我想要移至第一個字符串和第二個字符串之間的第二個字符串,然後按該字符串進行排序。我想繼續前進,直到沒有更多的字符串可以排序。 這是我的嘗試。你可以請告知我在做什麼錯:

public int CompareTo(object obj) 
    { 
     if (!(obj is Detail)) 
      return -1; 

     Detail detailToCompare = obj as Detail; 
     string[] splitString1 = detailToCompare.ID.Split('~'); 
     string[] splitString2 = ID.Split('~'); 

     for (int i = 0; i < splitString1.Length; i++) 
     { 
      //What should I do here???? 
      //return String.Compare(splitString1[i], splitString2[i]); 
     } 

     return 0; 
    } 
+0

'我需要通過爲各串的每蒂爾達和sorting'之間進行排序..不夠清晰,請解釋 – Ankur

+0

應該將三個例子是爲了什麼分類爲? –

+0

請提供排序對象的示例。現在,你沒有描述你想如何分類。 – Zruty

回答

2

這真的取決於如何希望這些ID進行排序。也許你的意思是這個?:

… 
for (int i = 0; i < splitString1.Length; i++) 
{ 
    int partComparisonResult = String.Compare(splitString1[i], splitString2[i]); 
    if (partComparisonResult == 0) 
    {    // these two parts are identical, 
     continue; // so move on to the next position. 
    }    // (this clause is superfluous, but included for clarity.) 
    else 
    {    // these parts differ, so return their sort order: 
     return partComparisonResult; 
    } 
} 

哪個應該結果的順序如下所示:

//  A~A~C~D~E~F~G~H 
//  | 
//  A~B~C~C~E~F~G~H 
//   | 
//  A~B~C~D~E~F~G~H 
//   | 
//  A~B~C~E~E~F~G~H 
//   | 
//  A~B~D~D~E~F~G~H 

也就是說,保留其他比較後一個部分,只要他們是平等的。只要找到不同的部件,就將該部件的比較結果作爲整個ID的比較結果返回。 。

順便說一句,你也應該檢查這兩個ID中包含部分的權數:

if (splitString1.Length != 8) 
{ 
    throw new ArgumentException(…); 
} 
if (splitString2.Length != 8) 
{ 
    throw new ArgumentException(…); 
} 
+0

+1:應該工作(我也會建議) – leppie

0

如果你只需要對列表進行排序,這也可以在LINQ做:

var q = details.OrderBy(a=>0); // to get an initial IOrderedEnumerable 
for (int i = 0; i < details[0].Split('~').Length; i++) 
{ 
    var itemp = i; // create local copy of i for closure 
    q = q.ThenBy(d => d.Split('~')[itemp].ToUpperInvariant()); 
} 

如果details是IEnumerable,那麼q是包含排序後的詳細信息的集合。對於樣品ID,Q將依次包含:

Detail~XXX~~XdfXX~XXX~XXX~OTHER~XXX 
something~XsdXX~XXX~XfdXX~XXX~XXX~OTHER~XXX 
something~XXX~XXX~XXX~XXX~XXX~OTHER~XXX 
x~x~~~~~x~x 

(編輯糾正碼初始誤差)

編輯:

如果你想使用IComparable的,你也可以做是這樣的:

public int CompareTo(object obj) 
{ 
    if (!(obj is Detail)) 
     throw new ArgumentException("obj"); 

    Detail detailToCompare = obj as Detail; 

    // get first unique element, and compare that   
    var firstnonequal = this.ID.Split('~') 
     .Zip(detailToCompare.ID.Split('~'), 
       (a, b) => new { ThisPartValue = a, OtherPartValue = b }) 
     .FirstOrDefault(a => a.ThisPartValue != a.OtherPartValue); 
     if (firstnonequal == null) return 0; // both IDs are equal 
     return firstnonequal.ThisPartValue.CompareTo(firstnonequal.OtherPartValue); 
     //^include flag for case insentivity, if desired 
    }