如何获得按标题编号排序的对象列表?

时间:2019-01-25 09:22:08

标签: c# dictionary

我的C#代码中有一个“标题”对象的字典:Dictionary<long, Title> DAllTitles

使用Title类定义如下:

    class Title
    {
        public long TitleID { get; set;}
        public string TitleText { get; set;}
        public string TitleNumber { get; set;}
    }

“ TitleNumber”可以具有以下值,例如:“ 1”,“ 1.1”,“ 2.10”,“ 4.6.5.2.5”等...将来可能会有更多的数字。

如何从字典DAllTitles中获得按“ TitleNumber”属性排序的字典或标题列表?我想不出一个简单的解决方案...

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用chefao帮助程序功能:

{'name': ['d', 'c', 'a', 'e', 'b'], 'c1': [2, 1, 0, 0, 0], 'c2': [1, 2, 3, 2, 0], 'c3': [4, 3, 1, 5, 2]}

然后用linq排序:

string padded(string s)
{
    var p = s.Split('.');
    var pp = string.Join("." , p.Select(x => Convert.ToInt16(x).ToString("00000")));
    return pp;
}

有些linq艺术家甚至可以将所有内容合而为一,但不是我;-)

请注意,我省略了所有检查!您也可以在函数中跳过一行,直接返回并选择字符串格式的最大位数。

输入(稍作修改的类):

List<Title> sorted = DAllTitles.OrderBy(x => padded(x.TitleNumber)).ToList();

输出:

var DAllTitles = new List<Title>()
{
    new Title("1.20"),new Title("1.2"),new Title("1.11"),new Title("1.1"),new Title("1.1.1")
    ,new Title("1.1.0"),new Title("1.1.3")
};

答案 1 :(得分:0)

可以实施以更正确地控制版本控制的类。

public class TitleNumber : IComparable
{
    private int[] Version;

    public TitleNumber(string titlenumber)
    {
        Version = titlenumber.Split('.').Select(x => int.Parse(x)).ToArray();
    }

    public int CompareTo(object obj)
    {
        if (obj is TitleNumber other)
        {
            return CompareTo(other);
        }
        else
        {
            throw new ArgumentException($"Object must be of type {nameof(TitleNumber)}");
        }
    }

    public int CompareTo(TitleNumber other)
    {
        var depth = 0;
        var depthThis = Version.Length - 1;
        var depthOther = other.Version.Length - 1;
        while (true)
        {
            if (depthThis == depth && depthOther == depth) return 0;
            if (depthOther < depth || (depthThis >= depth && Version[depth] > other.Version[depth])) return 1;
            if (depthThis < depth || Version[depth] < other.Version[depth]) return -1;
            depth++;
        }
    }

    public override bool Equals(object obj) => obj is TitleNumber other && CompareTo(other) == 0;
    public override string ToString() => string.Join(".", Version);
}

举例说明如何使用它:

var t1 = new TitleNumber("5.34.20");
var t2 = new TitleNumber("4");
var t3 = new TitleNumber("5.34");
var t4 = new TitleNumber("5.34.20.1");
var t5 = new TitleNumber("5.35");

var l = new List<TitleNumber>() { t1, t2, t3, t4, t5 };
var r = l.OrderBy(x => x).ToList();

答案 2 :(得分:-1)

我不确定我是否了解要对订购逻辑应用哪些规则,但是LINQ对我来说可以满足您的要求。

dico.OrderBy(kvp => kvp.Value.TitleNumber).ToDictionary(kvp => kvp.Key);

那将以某种方式对字典进行排序,我毫不怀疑您可以根据需要对其进行调整。

相关问题