2012-05-08 6 views
0

私は、文字列配列の最後の要素がソートキーであるリストをソートしたいと思います。 。私はこの作品リスト<string[]>ソートが機能しません

(下キーで)トップ5の結果を必要とするが、私は、LINQを使用したくない:

... 
    List<string[]> gameResults = OpenResults(fileLocation); 
    gameResults.Add(CurrentPlayerResult()); 

    var newOrderedGameResults = 
    from line in currentGameResults 
    orderby int.Parse(line.LastOrDefault()) 
    select line; 
    ... 

しかし、これはそうではない。

public void SaveResults(string fileLocation = @"..\..\GameResults.txt") 
    { 
     // string[] format: 
     // [0],..,[n-1], [n] 
     // names,  mistakeCount 
     List<string[]> gameResults = OpenResults(fileLocation); 
     gameResults.Add(CurrentPlayerResult()); 

     QuickSort(gameResults, 0, gameResults.Count - 1); 
     try 
     { 
      using (StreamWriter resultsFile = new StreamWriter(fileLocation)) 
      { 
       foreach (var line in gameResults.Take(5)) 
       { 
        for (int i = 0; i < line.Length - 1; i++) 
        { 
         resultsFile.Write("{0} ", line[i]); 
        } 
        // dont add " " after last element 
        resultsFile.WriteLine("{0}", line[line.Length - 1]); 
       } 
      } 
     } 
     catch (IOException exception) 
     { 
      Console.WriteLine("The file could not be write:"); 
      Console.WriteLine(exception.Message); 
     } 

private void QuickSort(List<string[]> listToSort, int left, int right) 
    { 
     int pivot = left; //(left + right)/2; 
     int leftHold = left; 
     int rightHold = right; 

     while (left < right) 
     { 
      while (GetScoreFromLine(listToSort[right]) >= pivot && left < right) 
      { 
       right--; 
      } 
      if (left != right) 
      { 
       listToSort[left] = listToSort[right]; 
       left++; 
      } 

      while (GetScoreFromLine(listToSort[left]) <= pivot && left < right) 
      { 
       left++; 
      } 
      if (left != right) 
      { 
       listToSort[right] = listToSort[left]; 
       right--; 
      } 
     } 
     listToSort[left] = listToSort[pivot]; 
     pivot = left; 
     left = leftHold; 
     right = rightHold; 

     if (left < pivot) 
     { 
      QuickSort(listToSort, left, pivot - 1); 
     } 
     if (right > pivot) 
     { 
      QuickSort(listToSort, pivot + 1, right); 
     } 
    } 

そして:

private int GetScoreFromLine(string[] lineToParce) 
    { 
     int length = lineToParce.Length; 
     return int.Parse(lineToParce[length - 1]); 
    } 

正常に動作しません。

ARRAY.SORTを使用する方法はありますか? 誰でも手伝ってください。おかげさまで

+0

問題を再現するために必要最小限のコード*を減らすことを検討してもよいでしょうか? 'List 'についてLINQを使わないでソートすることを考えると、それほど難しくないと思います。 – yamen

+4

なぜあなたはLINQを使いたくないのですか?また、通常の.Netソート方法を使用できないのはなぜですか? –

+0

ウェズリーワイザー、私は実装する方法を知っていません。ネットリストを並べ替え。あなたがリンクを例題に送ることができるなら、それは役に立ちます。 listToSortがintでGetScoreFromLine(listToSort [left/right])が単なる数値の場合、そのvoidとsortは正常に機能します。 –

答えて

0

次はあなたが必要なもののために働く必要があります:あなたはまたはlist.sortを使用できるように

public void SaveResults(string fileLocation = @"..\..\GameResults.txt") 
{ 
    // string[] format: 
    // [0],..,[n-1], [n] 
    // names,  mistakeCount 
    List<string[]> gameResults = OpenResults(fileLocation); 
    gameResults.Add(CurrentPlayerResult()); 
    gameResults.Sort(CompareResults); 
    ... 
} 

private int CompareResults(string[] left, string[] right) 
{ 
    if ((left == null && right == null) || (left.Length == 0 && right.Length == 0)) 
     return 0; 
    else if (left == null || left.Length == 0) 
     return 1; 
    else if (right == null || right.Length == 0) 
     return -1; 

    int leftVal = int.Parse(left[left.Length - 1]); 
    int rightVal = int.Parse(right[right.Length - 1]); 

    return leftVal.CompareTo(rightVal); 
} 
+0

のような美しさから離れようとしています。おかげさまで –

3

あなたは、私が推測するリストを使用しています。コンストラクタデリゲートを使用するか、コンペアクラスを使用するかどうかを指定します。

List<string[]> lists = new List<string[]> 
{ 
    new string[] { "1", "b", "5"}, 
    new string[] { "2", "b", "3"}, 
    new string[] { "3", "b", "1"}, 
    new string[] { "4", "b", "2"}, 
}; 
lists.Sort((a, b) => int.Parse(a[a.Length - 1]) - int.Parse(b[b.Length - 1])); 

リストを使用して例を表示するときにArray.Sortを特に要求する理由がわかりません。あなたはList.ToArray()を使用して、この1つはほぼ同じで、ジェネリックをCLRに追加されたとき、.NET Frameworkが長年にわたって進化したのか、一貫したきれい示し

var arr = lists.ToArray(); 
Array.Sort(arr, (a, b) => int.Parse(a[a.Length - 1]) - int.Parse(b[b.Length - 1])); 

使用することができますする必要がとにかく場合2005年に.NET 2.0で復活しました。

+0

自分のソーターを書いているだけでなく、ソート方法を使う方が面白いです(大したことはありません)。フレームワークの力を使いましょう! :) – Styxxy

+0

私はリストの並べ替えを意味しました;) –

+0

両方とも正常に動作しました。ありがとう。 –

関連する問題