[英]Sort a list alphabetically
我有以下課程:
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
遇到了這里顯示的一些問題val
- 您沒有使用該默認值IList<T>
時,使用Count
屬性更為慣用for
循環比使用while
循環向后遍歷列表更容易理解在 Stack Overflow 上還有使用 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.