C#应用程序如何为此实现字典或哈希表?

时间:2013-08-07 07:23:02

标签: c# .net dictionary hashtable

这是我的问题,我想写一个基本的控制台应用程序,我输入一个日期作为输入,如果该日期尚未输入应用程序然后允许时间输入一个注释,即2013年7月7日的时间下午5:00 - 晚上7:00输入文字blah blah

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

我正在考虑使用字典:

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

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

可以请一些人帮忙

3 个答案:

答案 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