110,537
社区成员
发帖
与我相关
我的任务
分享
DataTable table = new DataTable();
table.Columns.AddRange(new DataColumn[] {
new DataColumn("StartTime", typeof(DateTime)),
new DataColumn("EndTime", typeof(DateTime))
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/1 09:00:00"),
DateTime.Parse("2011/1/1 17:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/2 09:00:00"),
DateTime.Parse("2011/1/2 17:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/3 09:00:00"),
DateTime.Parse("2011/1/3 17:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/4 09:00:00"),
DateTime.Parse("2011/1/4 17:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/5 09:00:00"),
DateTime.Parse("2011/1/5 17:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/3 12:00:00"),
DateTime.Parse("2011/1/3 14:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/3 05:00:00"),
DateTime.Parse("2011/1/5 19:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/4 15:00:00"),
DateTime.Parse("2011/1/4 18:00:00")
});
table.Rows.Add(new object[] {
DateTime.Parse("2011/1/4 21:00:00"),
DateTime.Parse("2011/1/5 19:00:00")
});
IEnumerable<DataRow> rows = table.Rows.Cast<DataRow>();
var newRows = rows.Select((row, index) => new
{
Index = index,
Start = Convert.ToDateTime(row["StartTime"]),
End = Convert.ToDateTime(row["EndTime"])
});
var result = newRows.Where(row =>
newRows.Where(compare =>
compare.Index != row.Index && ((
compare.Start <= row.Start && row.Start <= compare.End ||
compare.Start <= row.End && row.End <= compare.End) || (
row.Start <= compare.Start && compare.Start <= row.End ||
row.Start <= compare.End && compare.End <= row.End))).Count() > 0
);
foreach (var item in result)
{
Console.WriteLine("Index:{0} StartTime:{1} EndTime:{2}",
item.Index, item.Start, item.End);
}
Console.WriteLine("\r\n===== 没有 Linq 是悲哀的 =====\r\n");
// 没有 Linq 是悲哀的
foreach (DataRow row in table.Rows)
{
DateTime rowStart = Convert.ToDateTime(row["StartTime"]);
DateTime rowEnd = Convert.ToDateTime(row["EndTime"]);
Console.WriteLine("{0}: {1} {2}",
table.Rows.IndexOf(row), rowStart, rowEnd);
foreach (DataRow compare in table.Rows)
{
DateTime compareStart = Convert.ToDateTime(compare["StartTime"]);
DateTime compareEnd = Convert.ToDateTime(compare["EndTime"]);
if (row == compare) continue;
if ((
compareStart <= rowStart && rowStart <= compareEnd ||
compareStart <= rowEnd && rowEnd <= compareEnd) || (
rowStart <= compareStart && compareStart <= rowEnd ||
rowStart <= compareEnd && compareEnd <= rowEnd))
{
Console.WriteLine("\t- {0}: {1} {2}",
table.Rows.IndexOf(compare), compareStart, compareEnd);
}
}
Console.WriteLine();
}
bool HasTimeSlotConflicts(IList<DataRow> rowList)
{
DataRow[] rows = rowList.OrderBy(r => r.Field<DateTime>("StartTime")).ToArray();
for (int i = 1; i < rows.Length; i++)
{
if (rows[i].Field<DateTime>("StartTime") < rows[i - 1].Field<DateTime>("EndTime")) return true;
}
return false;
}