簡體   English   中英

按字母順序排列列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM