按字母顺序排列列表

本文关键字:排列 列表 顺序 | 更新日期: 2023-09-27 18:04:45

我有以下类:

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

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

按字母顺序排列列表

您可以通过调用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会遇到下面所示的一些问题
  • 你可以在循环中声明val——你不用使用默认值
  • 知道使用的是IList<T> 时,使用Count属性更为习惯。
  • 在我看来,for循环比用while循环向后遍历列表更容易理解

在Stack Overflow - search中还有其他的使用Fisher-Yates进行洗牌的实现,你会很快找到一个。

有两种方法:

无LINQ: yourList.Sort();

与LINQ: yourList.OrderBy(x => x).ToList()>

您可以在:https://www.dotnetperls.com/sort

找到更多信息

另一种方式

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

您应该能够在LINQ中使用OrderBy

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

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

https://learn.microsoft.com/en——us/dotnet/api/system.collections.generic.list - 1. #过载