2015-11-02 2 views
1

У меня есть словарь, который будет заполнен из результатов запроса. Из-за этого я не знаю, какие значения данных будут поступать в словарь при инициализации (хотя, очевидно, я знаю, какие типы данных будут использоваться). Я новичок в C# - как я могу это настроить?C# инициализировать словарь, а затем добавить к нему позже

В псевдокоде словарь структура Я хочу:

{ 
    "visa": [2.75, 3.33], 
    "mastercard": [1.00, 4.32], 
    ... 
} 

Это то, что я до сих пор, но его не компиляции:

//initialize the dictionary but do not populate yet 
Dictionary<string, List<decimal>> cardtype_total_amount; 

//simulate getting the first card type from the db 
string cardtype = "visa"; 

//initialize the "visa" key 
if (!cardtype_total_amount.ContainsKey(cardtype)) cardtype_total_amount.Add(cardtype, new List<decimal>(){0, 0}); 

//simulate updating the values for "visa" from the db (this would happen lots of times for each card type): 
cardtype_total_amount[cardtype][0] += 0.5; 
cardtype_total_amount[cardtype][1] += 1.7; 

//add more keys for other cardtypes, and update their totals as per above... 
+0

Знаете ли вы ** что-нибудь ** о данных? Например, будет ли он всегда состоять из строки и двух поплавков? –

+0

Что значит «провал»? это бросает исключение? –

+0

@KonradViltersten да данные поступают из SQL Server и всегда будут строковыми и двумя типами «деньги». – mulllhausen

ответ

5

Я думаю, что вы просто не хватает в initalisation !

//initialize the dictionary but do not populate yet 
Dictionary<string, List<decimal>> cardtype_total_amount = new Dictionary<string, List<decimal>>(); 

[EDIT] О, и вам нужны м на ваших знаков после запятой ниже, в противном случае они двойники:

cardtype_total_amount[cardtype][0] += 0.5m; 
+0

Вот и все. Я действительно думал, что инициализирую словарь, объявив его тип. Наверное, нет. – mulllhausen

3

Не уверен, если это то, что вы после этого. Как это?

Dictionary<string, List<decimal> array 
    = new Dictionary<string, List<decimal>>(); 

Затем для каждого считывания (состоящего из ключа и значения) вы можете сделать следующее.

var addition = new { Key = "visa", Value = 3.14 }; 
array[addition.Key].Add(addition.Value); 

Обратите внимание, что я не на компьютере, поэтому могу немного опечатать. Кроме того, это немного зависит от того, как вы получаете последующие значения. Здесь подразумевается по одному. Если вы получите полный список из них, вы можете разбить это на сам словарь.

List<Piece> bunchOfValues = ...; 
Dictionary<...> results = bunchOfValues.ToDictionary(key => key.NameOrType, 
    value => bunchOfValues.Where(...).Select(...)); 

Наконец, если вы хотите суммировать все это, вы можете снова вернуться к LINQ.

decimal sum = arrayOfValues.Sum(element => element); 
+0

спасибо. очень полезный материал. – mulllhausen

Смежные вопросы