【问题标题】:Sorting Date and Time排序日期和时间
【发布时间】:2013-02-27 15:12:07
【问题描述】:

我正在尝试编写一个控制台应用程序,以根据开始日期按升序对我的日期和时间进行排序,这是我正在尝试做的一个示例。

我的意见:

休息开始1 = 15/02/12 12.30PM 休息结束 1= 15/02/12 01.30PM 休息开始 2 = 15/02/12 11.00AM 休息结束 2 = 15/02/12 12.00PM 休息开始 3 = 15/02/12 12.00PM 休息结束 3= 15/02/12 01.00PM

我希望我的输出应该是这样的:

休息开始 1 = 15/02/12 11.00AM 休息结束 1= 15/02/12 12.00PM 休息开始 2 = 15/02/12 12.00PM 休息结束 2= 15/02/12 01.00PM 休息开始 3 = 15/02/12 12.30PM 休息结束 3= 15/02/12 01.30PM

请建议我解决这个问题的最佳方法?

【问题讨论】:

  • 您能否将相应的开始和结束日期/时间存储在哈希表或类似结构中以维护它们之间的关系?
  • 如果您根据收到的答案提出新问题,请不要用全新的问题编辑您的问题。这具有将答案与原始上下文脱节的效果,并且意味着它们与新问题无关。如果您有补充问题,最好提出一个新问题,就像您现在所做的那样 - 谢谢。
  • 供参考,OP 的supplementary question is here

标签: c#


【解决方案1】:

我建议您将原始开始值和结束值配对,然后仅按开始日期排序。

首先,您必须将StartEnd 配对。例如。与类:

public class Break
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

然后,当您填充此类对象的集合时,只需使用 LINQ 按Start 对其进行排序。

var breaks = new List<Break>()
                 {
                     new Break()
                         {
                             Start = new DateTime(2012,2,15,12,30,0),
                             End = new DateTime(2012,2,15,13,30,0)
                             ... /// etc.
                         }
                 };

var ordered = breaks.OrderBy(s => s.Start);
foreach (var ord in ordered)
{
    System.Console.WriteLine(ord.Start);
    System.Console.WriteLine(ord.End);
}

编辑

要创建配对的日期时间对象,您可以使用如下方法:

public static Break ConvertToBreak(string startDate, string endDate, object gmtOffset)
{
     var dtStart = UnixTimeConverter(startDate, System.Convert.ToDecimal(gmtOffset));
     var dtEnd =  UnixTimeConverter(endDate, System.Convert.ToDecimal(gmtOffset));
     return new Break{Start = dtStart, End = dtEnd};
}

【讨论】:

  • 这是唯一将开始时间和结束时间配对的解决方案(截至目前)。所有其他解决方案都将日期时间视为 6 个单独的项目。
【解决方案2】:

您可以将所有 DateTimes 放入数组或列表中,并使用标准方法对数组或列表进行排序,示例请参见此处:http://www.csharp-examples.net/sort-array

在 .NET 中,DateTime 实现了IComparable 接口,因此很容易比较/排序这些变量。

这么说,您可以有两个数组或一个矩阵,并分别对它们中的每一个进行排序,因为从您的示例看来,您从 start 列中获取一个值,从 en 列中获取一个值等...

【讨论】:

    【解决方案3】:

    似乎您只想对日期/时间对象进行排序。由于您发布的代码不是 C#,所以我会做一些假设。

    首先:假设您的日期/时间组合位于DateTime object 中。我假设你有他们的清单。

    List<DateTime> dateTimes = new List<DateTime>();
    dateTimes.AddRange(new []
    {
        new DateTime(2012, 02, 15, 12, 30, 00),  // 15/02/12 12.30PM
        new DateTime(2012, 02, 15, 13, 30, 00),  // 15/02/12 01.30PM
        new DateTime(2012, 02, 15, 11, 00, 00),  // 15/02/12 11.00AM
        new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
        new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
        new DateTime(2012, 02, 15, 01, 00, 00),  // 15/02/12 01.00PM
    });
    

    您可以像这样对它们进行就地排序:

    dateTimes.Sort();
    

    否则,如果你有一个数组或任何IEnumerable&lt;T&gt;,你可以获得一个新的有序的可枚举序列:

    IEnumerable<DateTime> dateTimes = new []
    {
        new DateTime(2012, 02, 15, 12, 30, 00),  // 15/02/12 12.30PM
        new DateTime(2012, 02, 15, 13, 30, 00),  // 15/02/12 01.30PM
        new DateTime(2012, 02, 15, 11, 00, 00),  // 15/02/12 11.00AM
        new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
        new DateTime(2012, 02, 15, 12, 00, 00),  // 15/02/12 12.00PM
        new DateTime(2012, 02, 15, 01, 00, 00),  // 15/02/12 01.00PM
    };
    
    var orderedDateTimes = dateTimes.OrderBy(dt => dt);
    

    【讨论】:

    • 我不认为这会做他想要的,因为开始和结束日期时间值需要配对。您应该排序 3 个项目而不是 6 个。
    【解决方案4】:

    这是我的做法

    我不知道您对它们的发送方式有什么具体要求,或者结束时间是否总是比开始时间晚 1 小时,这个简单的示例显示了如何对它们进行相应的排序。

    //GetYourInputValues() refers to however you plans on pulling in these inputs.
    //It wasn't made clear in your post how you planned to do that.
    string[] inputValues = GetYourInputValues(); 
    
    //List that we will build, then sort, then print out.
    List<DateTime> sortedDateTime = new List<DateTime>();
    
    //Parse them into DateTime variables
    foreach(var input in inputValues)
    {
        DateTime inputDate;
        if(DateTime.TryParse(input, inputDate))
            sortedDateTime.Add(inputDate);
    }
    //Sort them ascending (for descending, flip a and b values)
    sortedDateTime.Sort((a, b) => a.CompareTo(b));
    
    //Print out the newly sorted values to console.
    foreach(DateTime dt in sortedDateTime)
    {
        Console.WriteLine(dt.ToString("MM/dd/yy hh:mm:ss tt")):
    }
    

    【讨论】:

      【解决方案5】:

      注意:如果您应该将每个开始/结束视为一对(以便它们始终在一起),那么您必须进行一些小的更改(请参阅@mipe34 答案) .否则,这是一个完整的工作示例:

      static void Main(string[] args) {
          string text = 
        @"break Start1 = 15/02/12 12.30PM
          break End1= 15/02/12 01.30PM
          break Start2 = 15/02/12 11.00AM
          break End2= 15/02/12 12.00PM
          break Start3 = 15/02/12 12.00PM
          break End3= 15/02/12 01.00PM";
      
          string[] splitted = text.Split(new string[] {"\n", "\r"}, StringSplitOptions.RemoveEmptyEntries);
          IList<DateTime> starts = new List<DateTime>();
          IList<DateTime> ends = new List<DateTime>();
          for (int i = 0; i < splitted.Length; i++) {
              string line = splitted[i].Trim();
              string date = line.Split('=')[1].Trim();
              DateTime d = DateTime.ParseExact(date, "dd/MM/yy hh.mmtt", null);
              if (line.StartsWith("break Start")) {
                  starts.Add(d);
              }
              else {
                  ends.Add(d);
              }
          }
      
          starts = starts.OrderBy(x => x).ToList();
          ends = ends.OrderBy(x => x).ToList();
      
          for (int i = 0; i < starts.Count; i++) {
              Console.WriteLine("break Start{0} = {1}", i + 1, starts[i].ToString("dd/MM/yy hh.mmtt"));
              Console.WriteLine("break End{0} = {1}", i + 1, ends[i].ToString("dd/MM/yy hh.mmtt"));
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        • 2012-08-16
        • 2019-07-21
        • 2016-08-09
        • 2011-05-03
        • 1970-01-01
        相关资源
        最近更新 更多