【问题标题】:How to create sorting logic with custom date strings如何使用自定义日期字符串创建排序逻辑
【发布时间】:2019-07-13 04:41:44
【问题描述】:

我想编写一个排序逻辑来将以下字符串排序为自定义类的输出:-

现在输出:- 3m_20,2m_20,1m_20,10d_20,5d_20,0d_20,0d_0,5d_0,10d_0,1m_0,2m_0,3m_0

所需的输出 0d_0,0d_20,5d_0,5d_20,10d_0,10d_20,1m_0,1m_20,2m_0,2m_20,3m_0,3m_20

我发现很难以上述方式进行排序。请帮助我如何根据需要进行排序?

我尝试使用 IComparable 根据“Id”对其进行排序,但它是根据第一个字符进行排序的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            DateDefinition d1 = new DateDefinition { Horizon = "0d",Days=20};
            DateDefinition d1_0 = new DateDefinition { Horizon = "0d",Days=0};
            DateDefinition d2 = new DateDefinition { Horizon = "5d",Days=20};
            DateDefinition d2_0 = new DateDefinition { Horizon = "5d",Days=0};
            DateDefinition d3 = new DateDefinition { Horizon = "10d",Days=20};
            DateDefinition d3_0 = new DateDefinition { Horizon = "10d",Days=0};
            DateDefinition d4 = new DateDefinition { Horizon = "1m",Days=20};
            DateDefinition d4_0 = new DateDefinition { Horizon = "1m",Days=0};
            DateDefinition d5 = new DateDefinition { Horizon = "2m",Days=20};
            DateDefinition d5_0 = new DateDefinition { Horizon = "2m",Days=0};
            DateDefinition d6 = new DateDefinition { Horizon = "3m",Days=20};
            DateDefinition d6_0 = new DateDefinition { Horizon = "3m",Days=0};

            var definitions = new List<DateDefinition> {d6,d5,d4,d3,d2,d1,d1_0,d2_0,d3_0,d4_0,d5_0,d6_0};

            definitions.Sort();

            foreach(var d in definitions)
            {
                Console.WriteLine(d.Id);
            } 
        }
    }

    public class DateDefinition : IComparable<DateDefinition>
    {
        public string Horizon { get; set; }
        public int Days { get; set; }
        public string Id
        {
            get { return Horizon + "_" + Days.ToString(); }
        }

        public int CompareTo(DateDefinition other)
        {
            if (ReferenceEquals(other, this)) return 0;
            if(ReferenceEquals(other,null)) return -1;
            return string.Compare(Id,other.Id, StringComparison.InvariantCultureIgnoreCase);
        }
    }    
}

输出到上述代码:-

0d_0 0d_20 10d_0 10d_20 1m_0 1m_20 2m_0 2m_20 3m_0 3m_20 5d_0 5d_20

需要这样的输出:-

0d_0 0d_20 5d_0 5d_20 10d_0 10d_20 1m_0 ​​1m_20 2m_0 2m_20 3m_0 3m_20

重要提示:请注意上述上下文中的 d=days , m=months

【问题讨论】:

    标签: c# linq sorting


    【解决方案1】:

    CompareTo 方法中,您使用的是string.Compare,因此它按字母顺序比较两个实例的计算Id 属性。按字母顺序,“10d_0”在“5d_0”之前。

    您想要进行某种数值比较,但您需要将 Horizo​​n 以月表示的值转换为以天表示的值(反之亦然)才能进行有效比较。

    将 Horizo​​n 属性定义为字符串似乎有点尴尬,因为它似乎包含数字和单位(d 代表天或 m 代表月)。您需要将它们解析出来并转换为数字,或者将 Horizo​​n 重新定义为数字 Horizo​​nValue 和字符串 Horizo​​nUnits。

    【讨论】:

    • 谢谢杰夫。 Horizo​​n 属性是一个字符串,因为它是一种业务需求,以这种方式表示它并在此基础上进行一些进一步的计算。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    相关资源
    最近更新 更多