0

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

我的输入:

休息开始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

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

4

5 回答 5

5

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

首先,您必须将Start和配对End。例如与类:

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

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

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};
}
于 2013-02-26T22:20:11.507 回答
1

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

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

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

于 2013-02-26T22:07:30.983 回答
1

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

首先:假设您在DateTimeobject中有日期/时间组合。我假设你有他们的清单。

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<T>一般的数组,您可以获得一个新的有序可枚举序列:

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);
于 2013-02-26T22:11:15.977 回答
1

这是我的做法

我不知道您对如何发送它们有什么具体要求,或者结束时间是否总是比开始时间晚 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")):
}
于 2013-02-26T22:14:05.610 回答
1

注意:如果您应该将每个开始/结束视为一对(以便它们始终在一起),那么您必须进行一些小的更改(请参阅@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"));
    }

}
于 2013-02-26T22:17:10.517 回答