2017-01-30 65 views
3

這使我瘋狂,但它必須如此簡單。訂單列表<T> enum

我有一個類,強度值可以是高/中/低: -

public class SearchResults 
{ 
    private List<string> _categories; 
    public string caseID { get; private set; } 
    ... 
    public string Strength { get; set; } 
} 

我做一個API調用,並得到一個List<SearchResults>

var resultres = JsonConvert.DeserializeObject<List<SearchResults>>(mycase.GetResults()); 

我」什麼m試圖做的是按照HIGH/MEDIUM/LOW的順序排列結果,但如果我按照以下順序排列,則按字母順序排列:H/L/M

resultres.Sort((x, y) => x.matchStrength.CompareTo(y.matchStrength)); 

我(可能不正確地)試圖用一個枚舉: -

enum ResultStrength 
{ 
    HIGH, 
    MEDIUM, 
    LOW 
} 

,但我不能找到一種方法,用它來強制命令,如果我用那麼下面它給了我一個「無法轉換lambda表達式鍵入「System.Collections.Generic.IComparer」,因爲它不是一個委託類型」

resultres.Sort((x, y) => x.ResultStrength.CompareTo(y.ResultStrength)); 

我已經嘗試實施各種IComparer<SearchResults>Comparison<SearchResults>,但我只是無法得到它來編譯和/或正常工作。

+0

怎麼樣orderBy? – OrcusZ

回答

2

如果你可以修改SearchResults類,那麼就Strength屬性更改從字符串型,將ResultStrength枚舉。 JSON.NET足夠聰明,可以從字符串名稱創建枚舉值。

public ResultStrength Strength { get; set; } 

排序將是簡單的:

resultres.OrderBy(r => r.Strength) 

注意:如果不提供值枚舉成員,默認情況下,他們將獲得以下值:

enum ResultStrength 
{ 
    HIGH = 0, 
    MEDIUM = 1, 
    LOW = 2 
} 

這麼高的意願走低前。如果要反轉順序,你可以使用OrderByDescending


否則,您可以通過從Strenth字符串解析枚舉值排序:

resultres.OrderBy(r => (int)Enum.Parse(typeof(ResultStrength),r.Strength)) 
+0

歡呼聲......你生活和學習!我發現我必須做下面的事情,因爲原來的resultres沒有被排序'resultres = resultres.OrderBy(r => r.matchStrength).ToList();' – DrDan

1

只需將其轉換爲整數

resultres.Sort((x, y) => ((int)x.ResultStrength).CompareTo((int)y.ResultStrength)); 
0

您是否嘗試過給枚舉名稱的價值?

enum ResultStrength 
{ 
    HIGH = 2, 
    MEDIUM = 1, 
    LOW = 0 
} 

然後,你可以只需按照@eocron's answer

resultres.Sort((x, y) => ((int)x.ResultStrength).CompareTo((int)y.ResultStrength)); 
0

沒有必要用枚舉,你可以使用在參考列表中的元素索引,以正確地訂購無序列表。

var ReferenceList = new List<string>() { "Low", "Medium", "High" }; 
var unorderedList = new List<string>() { "Low", "High", "Low", "Medium", "High" }; 

// Now we order unorderedList by using element's position in the ReferenceList. 
unorderedList.Sort((a, b) => ReferenceList.IndexOf(a).CompareTo(ReferenceList.IndexOf(b)));