我试图按保险丝的指示符属性对保险丝列表进行排序。
保险丝模型:
public class Fuse
{
public string Designator { get; set; }
public string Rating { get; set; }
public string Type { get; set; }
}
示例数据
这是一个保险丝列表的示例。
我尝试过的事情:
fuses = fuses.OrderBy(f => f.Designator).ToList();
上面的代码可以工作,但是将F10放在F2之前。有人知道指定人对列表进行适当排序的方法吗?我已经阅读了有关自然排序算法的信息,但不确定如何正确应用它们。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
如果仅比较字符串F2
,则顺序将大于F10
。
您可以尝试用order by
用Regex
进行编号。
使用^F(\d+)
模式获取数字,然后排序。
fuses = fuses.OrderBy(f => int.Parse(Regex.Match(f.Designator, @"^F(\d+)").Groups[1].Value)).ToList();
答案 1 :(得分:0)
您可以实现IComparable<T>
class Fuse : IComparable<Fuse>
{
public string Designator { get; set; }
public int CompareTo(Fuse other)
{
if (string.IsNullOrWhiteSpace(other?.Designator)) return -1;
if (string.IsNullOrWhiteSpace(this.Designator)) return 1;
if (this.Designator == other.Designator) return 0;
// get the first item in the range
var d1Str = this.Designator.Split(new[] {',', '-'})[0];
var d2Str = other.Designator.Split(new[] {',', '-'})[0];
// parse to int
var d1 = int.Parse(d1Str.Substring(1));
var d2 = int.Parse(d2Str.Substring(1));
return d1 > d2 ? 1 : -1;
}
}
测试代码
var list = new List<Fuse>()
{
new Fuse{Designator = "F8,F9"},
new Fuse{Designator = "F1,F2,F3"},
new Fuse{Designator = "F10-F12"},
new Fuse{Designator = "F4-F7"},
};
foreach (var itm in list.OrderBy(_ => _))
{
Console.WriteLine(itm.Designator);
}
Console.ReadLine();
输出
F1,F2,F3
F4-F7
F8,F9
F10-F12
答案 2 :(得分:-1)
您可以尝试按整数排序。扔掉第一个字母,解析为整数,然后按此整数排序。
f => Int32.Parse(f.Designator.Substring(1))
当然,您始终可以将其从lambda重构为其他内容。