这是我的问题,我想写一个基本的控制台应用程序,我输入一个日期作为输入,如果该日期尚未输入应用程序然后允许时间输入一个注释,即2013年7月7日的时间下午5:00 - 晚上7:00输入文字blah blah
然后应用程序将继续循环,如果我输入相同的日期,我不能进入 与上述相同的时间,但我应该能够输入7:00到8。
我正在考虑使用字典:Dictionary<string, Booking> BookingDict = new Dictionary<string, Booking>();
并将日期添加为id,但似乎只能输入一个元素id
可以请一些人帮忙
答案 0 :(得分:0)
你必须使用列表或字典吗?如果您不会在其中搜索很多并且没有很多元素,那么最好使用通用列表:List<Booking>
然后,您可以使用LINQ搜索列表以检索所需的预订。
答案 1 :(得分:0)
使用两个dateTime(开始和结束日期时间)创建一个键。如果要输入新的预订,请检查(例如,使用linq)是否已知新的开始和结束日期时间之间的结束日期时间,并对已知的开始日期时间执行相同操作。如果没有重叠,请添加它。
以下是一个例子:
Dictionary<TwoUintsKeyInfo,object> test = new Dictionary<TwoUintsKeyInfo, object>();
test.Add(new TwoUintsKeyInfo { IdOne = 3, IdTwo = 9 }, new object());
test.Add(new TwoUintsKeyInfo { IdOne = 10, IdTwo = 15 }, new object());
uint newStartPoint1 = 16,newEndPoint1=20;
bool mayUse = (from result in test
let newStartPointIsBetweenStartAndEnd = newStartPoint1.Between(result.Key.IdOne,result.Key.IdTwo)
let newEndPointIsBetweenStartAndEnd = newEndPoint1.Between(result.Key.IdOne,result.Key.IdTwo)
let completeOverlap = result.Key.IdOne < newStartPoint1 && result.Key.IdTwo > newEndPoint1
let oldDateWithingNewRange = result.Key.IdOne.Between(newStartPoint1, newEndPoint1) || result.Key.IdTwo.Between(newStartPoint1, newEndPoint1)
let FoundOne = 1
where newStartPointIsBetweenStartAndEnd || newEndPointIsBetweenStartAndEnd || completeOverlap || oldDateWithingNewRange
select FoundOne).Sum()==0;
使用:
public static class LinqExtentions
{
/// <summary>
/// Note: For the compare parameters; First the low, than the High
/// </summary>
/// <returns>Bool</returns>
public static bool Between<T1, T2, T3>(this T1 actual, T2 lowest, T3 highest)
where T1 : IComparable
where T2 : IConvertible
where T3 : IConvertible
{
return actual.CompareTo(lowest.ToType(typeof(T1), null)) >= 0 &&
actual.CompareTo(highest.ToType(typeof(T1), null)) <= 0;
}
}
public class TwoUintsKeyInfo
{
public uint IdOne { get; set; }
public uint IdTwo { get; set; }
public class EqualityComparerTwoUintsKeyInfo : IEqualityComparer<TwoUintsKeyInfo>
{
public bool Equals(TwoUintsKeyInfo x, TwoUintsKeyInfo y)
{
return x.IdOne == y.IdOne &&
x.IdTwo == y.IdTwo;
}
public int GetHashCode(TwoUintsKeyInfo x)
{
return (Math.Pow(x.IdOne, Math.E) + Math.Pow(x.IdTwo, Math.PI)).GetHashCode();
}
}
}
我测试了它,似乎正在工作。 祝你好运!
答案 2 :(得分:0)
我会推荐一个字典,其中键是日期,值是24个布尔代表小时的数组。只有预订是整整一小时。如果它是按分钟,则数组将太大,然后可能需要另一个选项。
如果预订小时,则数组中的每个单元格都为真,例如,如果&lt; 07/08/13,则预订[2] = true&gt;意味着在2013年8月7日预订的2-3小时被预订。
当您获得新预订时,您需要检查两者之间的每小时。如果您有4-10小时,则需要检查4,5,6,7,8,9中的值。不是我想的最好的效率,但如果没有人预订整整一周,那就没那么糟了。
总结一下,我的答案是使用
Dictionary<string/DateTime, bool[24]> bookingTbl