2011-09-24 108 views
1

我花了最後30分鐘瀏覽現有答案,以瞭解我認爲是一個常見問題,但沒有什麼比較適合我。道歉,如果這是一個騙局。如何使用我自己的邏輯對列表進行排序(不按字母順序或數字排序)

我有一個對象列表。

List<Journey> journeys; 

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

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

我想根據此字符串排序,但不是按字母順序排序。狀態描述了對象在旅途中的位置,即「航路」,「完成」或「錯誤」。按升序排序時,我希望它們按以下順序顯示:「錯誤」,「路由」,「完成」。 (實際上有更多的狀態比這個更重要,所以重命名它們以字母順序不是一個選項)

除了創建一個'狀態'的值與排序順序屬性,然後根據它進行排序,我該怎麼做呢?或者那是最好的方法?

回答

2

您可以自定義函數裏面的你排序邏輯被提供給Comparison代表:從Comparer<T>StringComparer

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 
})); 
0

除了創建一個具有值和排序順序屬性的'狀態'的類,然後根據它進行排序,我該怎麼做?

因爲這是你需要建立這樣一個類中的一些自定義的順序是一個好主意。

1

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

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

0

導出,用你的自定義邏輯實現類,通過這個類的一個實例來排序方法。

1

只是一種思路:

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

    public string Name; 
    public JourneyStatus Status; 
} 

使用排序依據:

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 

或者你可以修改拉姆達傳遞給排序依據映射狀態的值字符串到int

在某些情況下,您可能想要實施IComparer<T>,就像Jon說的那樣。它可以幫助保持排序邏輯和類定義本身在一個地方。

0

這樣做的一種方法是爲每個項目分配一個訂單號。因此,創建一個數據庫表來保存你的項目以及順序:

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

後來,當我填充下拉我可以在我的SQL選擇,而不是名稱進行排序。或者如果你不想使用數據庫,你可以改變狀態來包含命令,然後解析出狀態名稱:所以狀態值可能如下所示:「0,Enrout」,「1,」,「0」,「0」,「完成「,」2,錯誤「,那麼它會自然排序。然後,只需用分裂的順序從名字分開:

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

有很多的方式去給這隻貓的皮膚。