首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<string[]>排序无效

List<string[]>排序无效
EN

Stack Overflow用户
提问于 2012-05-08 20:48:00
回答 2查看 1.2K关注 0票数 0

我想对列表进行排序,其中字符串数组的最后一个元素是排序键。我需要前五名。(用较低的键)

这是可行的,但我不想使用LINQ:

代码语言:javascript
复制
    ...
    List<string[]> gameResults = OpenResults(fileLocation);
    gameResults.Add(CurrentPlayerResult());

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

但这并不是:

代码语言:javascript
复制
    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);
        }

其中:

代码语言:javascript
复制
    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);
        }
    }

和:

代码语言:javascript
复制
    private int GetScoreFromLine(string[] lineToParce)
    {
        int length = lineToParce.Length;
        return int.Parse(lineToParce[length - 1]);
    }

不要工作,正确。

有使用ARRAY.SORT的方法吗?任何人都可以帮忙。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2012-05-08 21:02:18

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

代码语言:javascript
复制
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(),然后使用

代码语言:javascript
复制
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时的演变过程。

票数 3
EN

Stack Overflow用户

发布于 2012-05-08 21:00:52

以下内容应该适用于您所需的内容:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10506252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档