我有以下课程:
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不太熟悉我刚刚听到一个建议,我可以使用它。
您只需调用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
会遇到shown here的一些问题val
- 你没有使用那个默认值Count
时,使用IList<T>
属性更加惯用for
循环比使用while
循环向后遍历列表更容易理解还有其他一些在Stack Overflow上使用Fisher-Yates进行混洗的实现 - 搜索,你会很快找到一个。
有两种方法:
没有LINQ:yourList.Sort();
使用LINQ:yourList.OrderBy(x => x).ToList()
您可以在以下位置找到更多信息:http://www.dotnetperls.com/sort-string-array
其他方式
_details.Sort((s1, s2) => s1.CompareTo(s2));
您应该能够在LINQ中使用OrderBy
...
var sortedItems = myList.OrderBy(s => s);
List<T>.Sort()
有什么问题?