按枚举类型对List<T>进行排序

3

这让我感到困惑,但一定很简单。

我有一个类,Strength的值可以是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
}

但是我找不到一种方法来使用它来强制顺序,如果我使用以下内容,则会出现“无法将 lambda 表达式转换为类型 'System.Collections.Generic.IComparer',因为它不是委托类型”的错误。

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

我尝试了实现各种IComparer<SearchResults>Comparison<SearchResults>,但我无法使其编译或正常工作。

orderBy 是什么? - OrcusZ
4个回答

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

谢谢你...人总是要不断学习的!我发现原始结果没有被排序,所以我不得不执行以下操作: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的回答进行操作。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接