按字母顺序排序列表

时间:2011-08-06 07:04:30

标签: c# .net linq sorting

我有以下课程:

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不是很熟悉我刚刚听到一个建议,我可以使用它。

5 个答案:

答案 0 :(得分: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创建一个 new 列表,其中包含原始值但已排序:

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

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

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

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

答案 1 :(得分:20)

有两种方法:

没有LINQ:yourList.Sort();

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

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

答案 2 :(得分:16)

另一种方式

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:1)