按字母顺序排序列表

问题描述 投票:68回答:5

我有以下课程:

class Detail
{
    public Detail()
    {
        _details = new List<string>();
    }
    public IList<string> Details { get { return _details; } }
    private readonly List<string> _details;
}

目前我使用以下方法随机对类进行排序:

void ShuffleGenericList<T>(IList<T> list)
{
    //generate a Random instance
    var rnd = new Random();
    //get the count of items in the list
    var i = list.Count();
    //do we have a reference type or a value type
    T val = default(T);

    //we will loop through the list backwards
    while (i >= 1)
    {
        //decrement our counter
        i--;
        //grab the next random item from the list
        var nextIndex = rnd.Next(i, list.Count());
        val = list[nextIndex];
        //start swapping values
        list[nextIndex] = list[i];
        list[i] = val;
    }
}

我想做的是按字母顺序对细节内容进行排序。

例如,如果内容如下所示:

[0] a
[1] d
[2] b

我希望能够运行此方法并将它们分类到:

[0] a
[1] b
[2] d

有谁知道这样做的简单方法?请注意,列表通常少于十个条目。我可以用LINQ做到这一点吗?抱歉,我对LINQ不太熟悉我刚刚听到一个建议,我可以使用它。

c# .net linq sorting
5个回答
133
投票

您只需调用List<T>.Sort就可以对列表进行排序:

list.Sort();

这将使用元素的自然排序,这在您的情况下很好。

编辑:请注意,在您的代码中,您需要

_details.Sort();

因为Sort方法仅在List<T>中定义,而不是IList<T>。如果您需要从外部对它进行排序,而您无法将其作为List<T>进行排序(您不应该将其视为List<T>部分是实现细节),您需要做更多的工作。

我不知道.NET中有任何基于IList<T>的就地排序,现在我想起来有点奇怪。 IList<T>提供了您需要的一切,因此它可以作为扩展方法编写。如果你想使用其中的一个,那么有很多快速配置实现。

如果你不关心一点效率低下,你总是可以使用:

public void Sort<T>(IList<T> list)
{
    List<T> tmp = new List<T>(list);
    tmp.Sort();
    for (int i = 0; i < tmp.Count; i++)
    {
        list[i] = tmp[i];
    }
}

换句话说,复制,就地排序,然后将排序后的列表复制回来。


您可以使用LINQ创建一个包含原始值但已排序的新列表:

var sortedList = list.OrderBy(x => x).ToList();

这取决于你想要的行为。请注意,您的shuffle方法并不是很理想:

  • 在方法中创建一个新的Random会遇到shown here的一些问题
  • 你可以在循环中声明val - 你没有使用那个默认值
  • 当你知道你正在使用Count时,使用IList<T>属性更加惯用
  • 在我看来,for循环比使用while循环向后遍历列表更容易理解

还有其他一些在Stack Overflow上使用Fisher-Yates进行混洗的实现 - 搜索,你会很快找到一个。


21
投票

有两种方法:

没有LINQ:yourList.Sort();

使用LINQ:yourList.OrderBy(x => x).ToList()

您可以在以下位置找到更多信息:http://www.dotnetperls.com/sort-string-array


16
投票

其他方式

_details.Sort((s1, s2) => s1.CompareTo(s2)); 

11
投票

您应该能够在LINQ中使用OrderBy ...

var sortedItems = myList.OrderBy(s => s);

1
投票
© www.soinside.com 2019 - 2024. All rights reserved.