2013-02-26 245 views
0

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

我输入:

 
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 

正在等我的输出应该是这样的:

 
break Start1 = 15/02/12 11.00AM 
break End1= 15/02/12 12.00PM 
break Start2 = 15/02/12 12.00PM 
break End2= 15/02/12 01.00PM 
break Start3 = 15/02/12 12.30PM 
break End3= 15/02/12 01.30PM 

请建议我解决这个最好的方法?

+1

你可以存储相应的开始和结束日期/在哈希表或类似结构倍保持它们之间的关系? – Melanie 2013-02-26 22:06:43

+0

如果您根据收到的答案有新问题,请不要使用全新的问题编辑您的问题。这具有将答案从原始上下文中分离出来的作用,并且意味着它们对于新问题没有意义。如果你有补充问题,最好问一个新问题,就像你现在所做的那样 - 谢谢。 – halfer 2013-02-27 07:15:05

+0

对于ref,OP的[补充问题在这里](http://stackoverflow.com/questions/15101915/how-to-add-date-objects-to-c-sharp-lists)。 – halfer 2013-02-27 07:15:54

回答

5

我建议要配对原来的开始和结束的值,然后只有起始日期订购。

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

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}; 
} 
+1

这是将开始和结束时间组合在一起的唯一解决方案(截至目前)。所有其他解决方案将日期时间视为6个单独的项目。 – JackAce 2013-02-26 22:31:51

1

,你可以把你所有的DateTime是否在数组或列表中,并使用标准方法对数组或列表进行排序,在这里看到了一个例子:http://www.csharp-examples.net/sort-array

在.NET中DateTime实现IComparable接口,以便对这些变量进行比较/排序非常容易。

这么说,你可以有两个数组或矩阵,并分别进行排序他们每个人,因为从你的例子,它看起来像你从开始列一个值和恩柱等一个值...

1

似乎就像你只想排序日期/时间对象一样。由于您发布的代码不是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<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); 
+0

我不认为这会做他想做的事,因为开始和结束日期时间值需要配对。您应该排序3个项目而不是6. – JackAce 2013-02-26 22:30:08

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")): 
} 
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")); 
    } 

}