2014-02-18 81 views
1

我有一本字典,我是從一個對象,依次從兩個不同的來源獲取數據填充一個元組:更新字典項與主要

  1. 一個簡單的for循環,其填充鍵,和
  2. IEnumerable這基本上是一個查詢。

我已經設法做了第一位,但我發現做另一個有點棘手。我不知道如何使用'double tuple'的單個組件完全檢索字典中的對象。這是我做雖然:

public class DictionaryValues 
{ 
    public int Index { get; set; } 
    public DateTime WeekStartingDate { get; set; } 
    public DateTime DueDate { get; set; } 
    public decimal DueQuantity { get; set; } 
    public int MaterialID { get; set; } 
} 

public static Dictionary<Tuple<int, int, DateTime>, DictionaryValues> 
    GetIncomingStockDatesWithinForecastPeriod(IEnumerable<PurchaseOrder> purchaseOrders) 
{ 
    var incomingStockDates = new Dictionary<Tuple<int, DateTime>, DictionaryValues>(); 

    var listDictionaryValues = new List<DictionaryValues>(); 

    for (int i = 0; i <= 20; i++) 
    { 
     var dictValuesObj = new DictionaryValues(); 

     var timeNow = Utilities.RemoveTimeFromDate(DateTime.Now); 

     dictValuesObj.Index = i; 
     dictValuesObj.WeekStartingDate = timeNow; 

     timeNow.AddDays(1); 

     listDictionaryValues.Add(dictValuesObj); 
    } 


    // Populate the keys 
    foreach (var dictValuesObj in listDictionaryValues) 
    { 
     incomingStockDates.Add(Tuple.Create(dictValuesObj.Index, dictValuesObj.WeekStartingDate), dictValuesObj); 
    } 

    // Populate other values 

    foreach (var purchaseOrder in purchaseOrders) 
    { 
     if (purchaseOrder.DueDate == incomingStockDates.Keys.First().Item2) 
     { 
      var dictValuesObj = new DictionaryValues(); 
      dictValuesObj.DueDate = purchaseOrder.DueDate; 
      dictValuesObj.DueQuantity = purchaseOrder.Quantity; 
      dictValuesObj.MaterialID = purchaseOrder.MaterialID; 

      // Update dictionary here and if the DueDate and MaterialID 
      // are already there then add this Quantity to the existin one 
     } 
    } 
} 

所以我希望做的是簡單地檢索出字典鍵的第二分量的對象,更新,然後如果一個對象已經具有相同DueDateMaterialDate存在只需將DueDate中的新數量添加到MaterialID的現有數量即可。

+6

我覺得你的做法是完全錯誤的,並勢必會造成問題。如果你打算更新一個密鑰,那麼字典就不是你的數據源。當內存中保存舊密鑰的其他代碼嘗試訪問該值時會發生什麼?哦,它會得到一個'KeyNotFoundException'。我會建議重新考慮你的問題。而且,你的鑰匙應該就是這個鑰匙。不是一個具有意義的值。 – evanmcdonnal

+0

請不要包含關於問題標題中使用的語言的信息,除非在沒有它的情況下沒有意義。標籤用於此目的。 –

+0

@evanmcdonnal我並不打算更新密鑰,只是用它來更新值。 –

回答

1

爲了配合其他答案,我認爲這是一個更好地利用面向對象的好機會。另外,將DictionaryValues重命名爲有意義的內容。我選擇了StockData,但它可以是任何適合的。

public class StockDatas { 
    public StockDatas(IEnumerable<PurchaseOrder> purchaseOrders) { 

    } 

    public StockData GetByDay(int day) { 
     // Create an object from the purchaseOrders brought in from the constructor 
    } 

    public Dictionary<int, StockData> GetStockDataGroupedByDay() { 
     // Create a dictionary keyed by the day number 
    } 
} 

然後你的代碼會很乾淨。

var stockDates = new StockDates(data); 
var stocksOnDayThree = stockDates.GetByDay(3); 
var stocksOnAllDays = stockDates.GetStockDataGroupedByDay(); 

然後,你將不必處理與具有元組的關鍵