【问题标题】:List<string[]> sorting doesn't workList<string[]> 排序不起作用
【发布时间】:2012-05-08 20:48:00
【问题描述】:

我想对 List 进行排序,其中字符串数组的最后一个元素是排序键。我需要前 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? 任何人都可以帮忙。 谢谢。

【问题讨论】:

  • 您是否会考虑将其减少到最少必要代码 以复制问题?考虑到我们谈论的是 List&lt;string[]&gt; 排序而不使用 LINQ,我想这并不难。
  • 为什么不想使用 LINQ,为什么不能使用常规的 .Net 排序方法?
  • Wesley Wiser,我不知道如何实现 .net 排序到列表。如果您可以将链接发送到示例,那将有所帮助。如果 listToSort 是 int 并且 GetScoreFromLine(listToSort[left/right]) 只是一个数字,则它的无效和排序工作正常。
  • @yamen 因为它是就地排序的。
  • 我当然不明白,为什么你会主动远离gameResults.OrderBy(x =&gt; int.Parse(x[x.Length - 1]))这样的美女

标签: c# .net string list sorting


【解决方案1】:

你使用 List,所以你也可以使用 List.Sort 我猜。使用比较器委托,或者如果您也坚持使用比较器类。

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]));

我不确定为什么在展示带有 List 的示例时特别要求使用 Array.Sort。无论如何,如果您需要,您可以使用 List.ToArray() 然后使用

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

这个几乎相同,并且很好地展示了 .NET 框架在 2005 年使用 .NET 2.0 将泛型添加到 CLR 时多年来的一致性。

【讨论】:

  • 比编写自己的排序器的杂乱无章要整洁得多(好吧,这样做很有趣,但使用 Sort 方法要简洁得多)。使用框架的力量! :)
【解决方案2】:

以下内容应该可以满足您的需要:

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

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 1970-01-01
    • 2018-01-19
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多