使用元组键更新字典项

时间:2014-02-18 18:31:55

标签: c# c#-4.0 dictionary

我有一个字典,我从一个对象填充,然后从两个不同的来源获取数据:

  1. 一个简单的for循环,用于填充键,
  2. IEnumerable基本上是一个查询。
  3. 我当然设法做了第一点,但我发现做另一个有点棘手。我不知道如何使用'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
            }
        }
    }
    

    所以我想做的只是通过dictionary-key的第二个组件检索一个对象,更新该对象,然后如果一个对象已经存在且具有相同的DueDateMaterialDate,只需添加DueDate的{​​{1}}上的现有新数量。

1 个答案:

答案 0 :(得分:1)

与其他答案一致,我认为这是一个更好地利用OO的好机会。此外,将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();

然后你不必处理以元组为核心的