按字母顺序排列列表
我有以下class级:
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
有谁知道一个简单的方法来做到这一点? 请注意,列表通常less于10个条目。 我可以用LINQ来做这个吗? 对不起,但我不是很熟悉LINQ我刚刚听到一个build议,我可以使用它。
你可以通过调用List<T>.Sort
就地sorting列表:
list.Sort();
这将使用元素的自然sorting,在你的情况下,罚款。
编辑:请注意,在你的代码中,你需要
_details.Sort();
因为Sort
方法仅在List<T>
定义,而不是IList<T>
。 如果你需要从外部对它进行sorting,那么你不能像List<T>
那样访问它(你不应该把它作为List<T>
部分是一个实现细节),你需要做一个多一点工作。
我不知道 .NET中的任何基于IList<T>
的就地sorting,现在我想起来有点奇怪。 IList<T>
提供你需要的所有东西,所以它可以写成扩展方法。 如果你想使用其中的一种,有很多快速sorting的实现。
如果你不关心一点低效率,你总是可以使用:
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]; } }
换句话说,复制,sorting,然后将sorting的列表复制回来。
您可以使用LINQ来创build一个新的列表,其中包含原始值,但sorting:
var sortedList = list.OrderBy(x => x).ToList();
这取决于你想要的行为。 请注意,你的洗牌方法并不是很理想:
- 在这个方法中创build一个新的
Random
遇到这里显示的一些问题 - 你可以在循环中声明
val
– 你没有使用这个默认值 - 当您知道您正在使用
IList<T>
时,使用Count
属性更为通俗易懂 - 在我看来,
for
循环比使用while
循环向后遍历列表更容易理解
在Stack Overflow中还有其他一些与Fisher-Yates混洗的实现 – search,你会发现很快。
有两种方法:
没有LINQ: yourList.Sort();
用LINQ: yourList.OrderBy(x => x).ToList()
您可以在以下urlfind更多信息: 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()
什么问题?