我试图编写一个控制台应用程序,根据开始日期按升序排序我的日期和时间,这是我要做的一个例子。
我的意见:
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
请建议我解决此问题的最佳方法?
答案 0 :(得分:5)
我建议您要将原始开始值和结束值配对,然后仅按开始日期对其进行排序。
首先,您必须配对Start
和End
。例如。上课:
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};
}
答案 1 :(得分:1)
您可以将所有日期时间放在数组或列表中,并使用标准方法对数组或列表进行排序,请参阅此处以获取示例:http://www.csharp-examples.net/sort-array
在.NET中,DateTime实现了IComparable
接口,因此很容易对这些变量进行比较/排序。
这么说,你可以有两个数组或一个矩阵,并分别对每个数组进行排序,因为从你的例子中看起来你从start列获取一个值,从en列获取一个值等...
答案 2 :(得分: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);
答案 3 :(得分: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")):
}
答案 4 :(得分: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"));
}
}