按字母顺序排列列表

我有以下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);