这让我感到疯狂,但必须如此简单。
我上过课,力量值可以是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>
,但我无法让它进行编译和/或正常工作。
答案 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)));