簡體   English   中英

如何使用我自己的邏輯對列表進行排序(不按字母順序或數字順序)

[英]How to sort a list using my own logic (not alphabetically or numerically)

我花了最后30分鍾來查看現有的答案,我認為這是一個常見的問題,但沒有什么能夠幫助我。 如果這是一個騙局,請道歉。

我有一個對象列表。

List<Journey> journeys;

該對象具有'status'屬性 - 這是一個字符串。

class Journey
{
    public string Name;
    public string Status; 
}

我想基於這個字符串進行排序,但不是按字母順序排序。 狀態描述了物體在旅程中的位置,“Enroute”,“Finished”或“Error”。 按升序排序時,我希望它們按以下順序顯示:“錯誤”,“路由”,“已完成”。 (實際上有比這更多的狀態,因此將它們重命名為按字母順序排列不是一種選擇)

除了使用值和排序順序屬性創建“狀態”類,然后基於此進行排序之外,我該如何做? 或者這是最好的方法?

您可以在自定義函數內部定義您的排序邏輯,該邏輯提供給比較委托:

List<Journey> list = new List<Journey>();

list.Sort(new Comparison<Journey>((Journey source, Journey compare) => 
{ 
    // here is my custom compare logic
    return // -1, 0 or 1
}));

您需要創建一個實現IComparer<Journey>並相應地實現Compare方法。

你沒有提到你是如何准確排序的,但是幾乎涉及排序的BCL的所有方法都有一個接受IComparer的重載,以便你可以插入你的邏輯。

另一個想法:

class Journey
{
    public enum JourneyStatus
    {
        Enroute,
        Finished,
        Error
    }

    public string Name;
    public JourneyStatus Status;
}

與OrderBy一起使用:

var journeys = new List<Journey>();
journeys.Add(new Journey() { Name = "Test1", Status = Journey.JourneyStatus.Enroute });
journeys.Add(new Journey() { Name = "Test2", Status = Journey.JourneyStatus.Error });
journeys.Add(new Journey() { Name = "Test3", Status = Journey.JourneyStatus.Finished });
journeys.Add(new Journey() { Name = "Test4", Status = Journey.JourneyStatus.Enroute });

journeys = journeys.OrderBy(x => x.Status).ToList();

foreach (var j in journeys)
    Console.WriteLine("{0} : {1}", j.Name, j.Status);

輸出:

Test1 : Enroute
Test4 : Enroute
Test3 : Finished
Test2 : Error

或者您可以修改傳遞給OrderBy的lambda,以將Status字符串的值映射到int

在某些情況下,你可能想要實現IComparer<T> ,就像Jon說的那樣。 它可以幫助將排序邏輯和類定義本身保存在一個位置。

除了使用值和排序順序屬性創建“狀態”類,然后基於此進行排序之外,我該如何做?

由於這是一些自定義順序,您需要創建這樣一個類是一個好主意。

Comparer<T>StringComparer類派生,使用您的自定義邏輯實現類,將此類的實例傳遞給sort方法。

一種方法是為每個項目分配一個訂單號。 因此,創建一個數據庫表來保存您的項目及其順序:

Column Name, Column Order
Enrout , 0
Finished, 1
Error, 2

然后,當我填充下拉列表時,我可以按照SQL選擇中的順序而不是名稱進行排序。

或者,如果您不想使用數據庫,可以更改Status以包含訂單,然后只解析Status名稱:so Status值可能如下所示:“0,Enrout”,“1,Finished”,“ 2,錯誤“然后它會自然排序。 然后使用split將命令與名稱分開:

string[] statusArr = status.split(',');
string order = statusArr[0];
string statusname = statusArr[1];

有很多方法可以給這只貓上皮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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