自然地使用T的属性自然地排序List <t>

时间:2018-09-26 19:02:26

标签: c# .net linq sorting

我试图按保险丝的指示符属性对保险丝列表进行排序。

保险丝模型:

public class Fuse
{
    public string Designator { get; set; }

    public string Rating { get; set; }

    public string Type { get; set; }
}

示例数据

这是一个保险丝列表的示例。

enter image description here

我尝试过的事情:

fuses = fuses.OrderBy(f => f.Designator).ToList();

上面的代码可以工作,但是将F10放在F2之前。有人知道指定人对列表进行适当排序的方法吗?我已经阅读了有关自然排序算法的信息,但不确定如何正确应用它们。

任何帮助将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:0)

如果仅比较字符串F2,则顺序将大于F10

您可以尝试用order byRegex进行编号。

使用^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重构为其他内容。