订单列表<t> by enum

时间:2017-01-30 15:58:50

标签: c#

这让我感到疯狂,但必须如此简单。

我上过课,力量值可以是HIGH / MEDIUM / LOW: -

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());

我尝试做的是按HIGH / MEDIUM / LOW的顺序订购结果,但如果我执行以下操作,则按字母顺序排列,即H / L / M

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

我(可能是错误的)尝试使用枚举: -

enum ResultStrength
{
    HIGH,
    MEDIUM,
    LOW
}

但是我无法找到一种方法来使用它来强制执行命令,如果我使用以下内容则它会给我一个&#34;无法将lambda表达式转换为&#39; System.Collections.Generic .IComparer&#39;因为它不是代表类型&#34;

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

我已尝试实施各种IComparer<SearchResults>Comparison<SearchResults>,但我无法让它进行编译和/或正常工作。

4 个答案:

答案 0 :(得分:2)

如果您可以修改SearchResults类,则只需将Strength属性从字符串类型更改为ResultStrength枚举类型。 JSON.NET足够聪明,可以从字符串名称创建枚举值。

public ResultStrength Strength { get; set; }

排序很简单:

resultres.OrderBy(r => r.Strength)

注意:如果您没有为枚举成员提供值,默认情况下,它们将获得以下值:

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

所以HIGH会在LOW之前发生。如果您想要逆转订单,可以使用OrderByDescending

否则,您可以按照从Strenth字符串解析的枚举值进行排序:

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

答案 1 :(得分:1)

只需将其转换为整数:

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

答案 2 :(得分:0)

您是否尝试过给枚举名称一个值?

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

然后你可以关注@eocron's answer

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

答案 3 :(得分: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)));