按字母顺序排列列表
本文关键字:排列 列表 顺序 | 更新日期: 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
——你不用使用默认值 当知道使用的是 - 在我看来,
for
循环比用while
循环向后遍历列表更容易理解
IList<T>
时,使用Count
属性更为习惯。在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. #过载