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