我有以下课程:

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

推荐答案

您只需拨打List<T>.Sort即可对列表in-place进行排序:

list.Sort();

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

编辑:请注意,在代码中

_details.Sort();

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

我不知道IList<T>个就地排序中有know个.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];
    }
}

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


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

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

这取决于你想要什么样的行为.请注意,你的洗牌方法并不理想:

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

在Stack Overflow-Search上还有与Fisher-Yates混洗的其他实现,您很快就会找到一个.

.net相关问答推荐

API响应返回null错误. NET MAUI

.NET restore/build在使用组织包的Github Action工作流中调用时获得401

我的Azure应用服务从哪里获取应用设置?

IANA 到 Windows 时区映射

无法加载文件或程序集 不支持操作. (来自 HRESULT 的异常:0x80131515)

如何调试 .NET 运行时中的内部错误?

Web API 中基于令牌的身份验证,无需任何用户界面

如何在 MSBuild 脚本中获取当前目录?

.NET 的future 版本会支持 C# 中的元组吗?

如何在 EF 代码优先中禁用链接表的级联删除?

为什么 ?: 会导致转换错误,而 if-else 不会?

获取当前方法的名称

读取方法的属性值

如何使用转储文件来诊断内存泄漏?

日期时间是什么意思?在 C# 中是什么意思?

如何允许程序集(单元测试)访问另一个程序集的内部属性?

使用 XmlDocument 读取 XML 属性

带有嵌套控件的设计模式

如何在 C# 中使用迭代器反向读取文本文件

如何使用匿名方法返回值?