我有以下课程:
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不是很熟悉我刚刚听到一个建议,我可以使用它。
答案 0 :(得分:133)
您只需致电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创建一个 new 列表,其中包含原始值但已排序:
var sortedList = list.OrderBy(x => x).ToList();
这取决于您想要的行为。请注意,您的shuffle方法并不理想:
Random
会遇到一些问题shown here val
- 您不是使用默认值Count
IList<T>
属性更为惯用
for
循环比使用while
循环向后遍历列表更容易理解还有其他一些在Stack Overflow上使用Fisher-Yates进行混乱的实现 - 搜索,你会很快找到一个。
答案 1 :(得分:20)
有两种方法:
没有LINQ:yourList.Sort();
使用LINQ:yourList.OrderBy(x => x).ToList()
您可以在以下网址找到更多信息:http://www.dotnetperls.com/sort-string-array
答案 2 :(得分:16)
另一种方式
_details.Sort((s1, s2) => s1.CompareTo(s2));
答案 3 :(得分:11)
你应该能够在LINQ中使用OrderBy
...
var sortedItems = myList.OrderBy(s => s);
答案 4 :(得分:1)
List<T>.Sort()
有什么问题?