按字母顺序排序列表

Mar*_*iko 74 .net c# linq sorting

我有以下课程:

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

[0] a
[1] d
[2] b
Run Code Online (Sandbox Code Playgroud)

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

[0] a
[1] b
[2] d
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 139

您可以通过调用以下方式对列表进行排序List<T>.Sort:

list.Sort();
Run Code Online (Sandbox Code Playgroud)

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

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

_details.Sort();
Run Code Online (Sandbox Code Playgroud)

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

我不知道IList<T> .NET中有任何基于inb的排序,现在我想起来有点奇怪.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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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


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

var sortedList = list.OrderBy(x => x).ToList();
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 22

有两种方法:

没有LINQ: yourList.Sort();

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

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


lah*_*rah 19

其他方式

_details.Sort((s1, s2) => s1.CompareTo(s2)); 
Run Code Online (Sandbox Code Playgroud)

  • 这个优点是适应**按其中一个属性**排序任何对象. (8认同)

Qui*_*son 11

你应该可以OrderBy在LINQ中使用......

var sortedItems = myList.OrderBy(s => s);
Run Code Online (Sandbox Code Playgroud)

  • 注意:返回`IEnumerable <T>`并且不是就地排序 (2认同)