2013-08-07 48 views
0

這是我的問題,我想寫一個基本的控制檯應用程序,我輸入一個日期作爲輸入,如果該日期沒有進入應用程序,然後允許一段時間輸入一個筆記,即對於時間爲07/08/2013 5 :00 - 7:00 pm輸入文字等等等等C#應用程序我怎麼能實現這個字典或散列表?

然後應用程序將保持循環,如果我輸入相同的日期,我不應該能夠輸入 與上面相同的時間,但我應該可以輸入7:例如00到8。

我想用字典:

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

,並添加日期作爲ID,但似乎只能唯一進入

一個元素ID可以有一個人請幫助

+0

可以使數據時 –

+0

你需要防止重疊的組合鍵?在您的示例中,我是否可以在下午6:00至8:00之間創建07/08/2013的條目? – DavidN

+0

在你的'string'的例子中,你使用什麼樣的*作爲關鍵字? –

回答

0

你必須使用列表或字典?如果你不會在其中搜索很多元素,你可能最好用一個通用列表:List<Booking>

然後你可以使用LINQ來搜索列表來檢索你需要的預訂。

+0

我不必使用列表或字典,但我不想使用LINQ謝謝 – kayze

+0

然後使用3維詞典有你的關鍵是日期和對象是另一個字典。第二個dicitionary應該有時間作爲關鍵。因此,檢索它將是2個步驟,首先獲取當天的字典,然後檢索所需的時間段。 – AntSpiteri

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(); 
     } 
    } 
} 

我測試了,似乎是工作。 祝你好運!

+0

嗨感謝您的回覆。它看起來像一個很好的解決方案,它非常複雜,我想保持簡單。我想用像array/arraylist/list/linklist/dictionery和組合這樣的簡單數據結構。你能提供一個例子,說明如何在不使用LINQ的情況下實現這個功能,謝謝 – kayze

+0

沒有;-)但是這實際上很簡單,不是嗎?我不知道是否有人有一個更簡單的解決方案... – user369122

+0

順便==>「我想使用簡單的數據結構像數組/列陣/列表/ linklist/dictionery」你注意到我其實USE字典?在這個例子中,我確保你檢查任何重疊的時間(在這種情況下是一個uint,只是一個例子,你也可以使用datetime)。如果你想檢查任何重疊,沒有linq,我認爲如果你想檢查與本例中相同的條件,代碼會更大更復雜。但隨時可以改變;-) – user369122

0

我會推薦一本字典,其中的關鍵是日期和值是24個布爾值的數組代表小時。只有在預訂時間爲全天時間的情況下。如果是在一分鐘之內,那麼數組將會太大,然後可能需要另一個選項。

如果小時已預訂,則陣列中的每個單元格都爲true,例如,如果< 07/08/13,預訂[2] = true>表示小時2-3在07/08/13預訂,則預訂。

當你得到一個新的預訂,你需要檢查兩個之間的每個小時。如果你有4-10小時的時間,你需要檢查4,5,6,7,8,9的值。不是我認爲的最高效率,但如果沒有人預訂整整一週左右,那也不會那麼糟糕。

總結一下我的回答是使用

Dictionary<string/DateTime, bool[24]> bookingTbl 
+0

看起來不錯,你能舉個例子嗎?或提取 – kayze

相關問題