2011-08-12 4 views
0

を実装する方法を私はオブジェクトのリストを持っていると私はフォーマット.NET IComparableをは:

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

例えばである自分のIDでそれらを注文する必要があります

"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" 

各ティルダとソートの間で各文字列を並べ替える必要があります。だから最初に弦を最初のティルダに持って行き、その弦でソートしたい。次に、第1と第2ティルダの間の第2ストリングに移動し、そのストリングでソートしたいと思います。私は並べ替える弦がなくなるまで続けていきたいです。 これは私の試みです。あなたは私が間違ってやってアドバイスしてくださいすることができます

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をソートする方法に依存します。

//  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 

である限り、それらが等しいとして次々の部分を比較しておく:。おそらく、あなたは、これが結果、次のような順序でなければならない

… 
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; 
    } 
} 

を?:意味しました異なるパーツが見つかるとすぐに、そのパーツの比較結果を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()); 
} 
ところで

、あなたはまた、両方のIDが部品の右の数が含まれていることを確認する必要があります

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 
    } 
関連する問題