0

这是我的问题,我想编写一个基本的控制台应用程序,在其中输入日期作为输入,如果该日期尚未输入应用程序,则允许时间输入注释,即 07/08/2013 时间 5:00 - 晚上 7:00 输入文本等等

然后应用程序将继续循环,如果我输入相同的日期,我不应该能够输入与上述相同的时间,但我应该能够输入 7:00 到 8 的例子。

我正在考虑使用字典:

Dictionary<string, Booking> BookingDict = new Dictionary<string, Booking>();

并添加日期作为id,但似乎只能唯一输入一个元素id

有人可以帮忙吗

4

3 回答 3

0

创建具有两个日期时间(开始和结束日期时间)的键。当您要输入新的预订时,请检查(例如使用 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();
        }
    }
}

我测试了它,似乎可以正常工作。祝你好运!

于 2013-08-07T07:48:13.157 回答
0

我会推荐一个字典,键是日期,值是一个由 24 个布尔值组成的数组,代表小时。只有当预订是全小时的。如果它是由分钟然后阵列将太大,然后可能需要另一个选项。

如果预订了小时,则数组中的每个单元格都为真,例如,如果 <07/08/13,booked[2] = true> 表示预订了 07/08/13 的 2-3 小时。

当您收到新的预订时,您需要在两者之间每小时检查一次。如果您有 4-10 小时的时间,您需要检查 4、5、6、7、8、9 中的值。我认为不是最好的效率,但如果没有人预订一整周左右,也不会那么糟糕。

总结一下我的答案是使用

Dictionary<string/DateTime, bool[24]> bookingTbl
于 2013-08-07T07:53:06.823 回答
0

您必须使用列表或字典吗?如果您不会在其中进行大量搜索并且没有很多元素,那么您最好使用通用列表:List<Booking>

然后,您可以使用 LINQ 搜索列表以检索您需要的预订。

于 2013-08-07T07:37:02.783 回答