按字母顺序对列表进行排序


83

我有以下课程:

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

Answers:


154

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

list.Sort();

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

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

_details.Sort();

因为该Sort方法仅在中定义List<T>,而不在中定义IList<T>。如果您需要从外面无法访问的地方对其进行排序List<T>(您不应该将其作为List<T>实现的详细信息进行转换),则需要做更多的工作。

我不知道IList<T>.NET中有任何基于原位的排序,现在我想到它有点奇怪。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();

这取决于您想要哪种行为。请注意,您的随机播放方法并不是很理想:

  • Random在该方法中创建新方法会遇到此处显示的一些问题
  • 您可以val在循环内声明-您未使用该默认值
  • Count当您知道自己正在使用计算机时,使用该属性更为习惯IList<T>
  • 在我看来,for循环比使用while循环向后遍历列表更容易理解

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


因此,如果我想对您在上面创建的列表进行排序,那么我只需要说:sortedList.Sort?
圆子

我尝试了排序,但无法使其正常工作。-我的列表如下所示:IList <string> nD。我尝试了nD.Sort(),但它说:无法解析符号“ Sort”。
圆子

@Mariko:使用_details.Sort()-_details声明为List<string>而不是IList<string>Sort仅在上声明List<T>,不在上声明IList<T>
乔恩·斯基特

24

有两种方法:

没有LINQ: yourList.Sort();

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

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


@Dminox-我的列表如下所示:IList <string> nD。我尝试了nD.Sort(),但它说:无法解析符号“ Sort”。
圆子

1
@MarikoSort()List<T> not 的成员IList<T>。您可以考虑改用前者(除非您期望使用不同的IList<T>实现。)
dlev 2011年

23

其他方式

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

10
对象的优点是可以根据其属性之一对任何对象进行排序
MGOwen


1

有什么问题List<T>.Sort()吗?

http://msdn.microsoft.com/en-us/library/3da4abas.aspx


@goril-我想使用这个,但是出现错误。这就是我添加到其他评论中的内容。希望能对您有所帮助-我的列表如下所示:IList <string> nD。我尝试了nD.Sort(),但它说:无法解析符号“ Sort”。
圆子

1
@Mariko:您使用的接口IList <T>不包含Sort方法。直接对List <T>变量进行排序。换句话说,您可以_details从示例中进行排序,但不能排序Details
Oleg Dudnyk 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.