2017-01-30 66 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)));