2012-03-27 4 views
5

Я использую словарь для хранения некоторых пар значений ключей и задал вопрос о наилучшем способе заполнения словаря. Мне нужно сделать некоторые другие операции, чтобы найти и добавить мои ключевые пары значений в словарь. После этих операций я мог найти ключ/значение для добавления в словарь, иначе я бы ничего не нашел. Мой вопрос в том, как я должен заполнить словарь. Должен ли я использовать функцию, которая возвращает пару значений ключа, если она найдена, и в противном случае пустая, содержащаяся в словаре.Add (функция()) вызывает? Я не хочу добавлять пустые пары ключ/значение в словарь, поэтому я не уверен, как работает обратный вызов для этой функции. Или я должен передать словарь функции и добавить к ней, если это необходимо? какДобавление пары ключ/значение в словарь

function(dictionary) 
{ if (pair found) {dictionary.add(pair)}} 
+1

Почему бы не использовать родной словарь ? Он уже управляет хранилищем, имеет метод ContainsKey для проверки существования ключа, и вы можете использовать LINQ для его возврата в записи KeyValuePair ? –

+0

Я ищу лучший способ заполнить словарь . Чтобы заполнить его, мне нужно выполнить некоторые другие операции, чтобы придумать объекты для размещения в dict. Поэтому, нужно ли я нажимать эти операции на метод и возвращать ли его пару с ключом, чтобы затем добавить к dic? или я должен передать вновь созданный dict и передать его функции, чтобы добавить к ней, если найдены какие-либо значения? –

+0

Это действительно зависит от того, что вы пытаетесь сделать с этим методом, и должен ли он иметь эту способность. По моему мнению, я бы просто вдавил словарь, и пусть этот метод выполнит свою работу. Это будет проще всего реализовать. –

ответ

10

Не уверен, что вы просите здесь, но вот как я обрабатывать словарь либо добавить или обновить значение, основанное на ключ:

string key = "some key here"; 
string value = "your value"; 
if (myDict.ContainsKey(key)) 
{ 
    myDict[key] = value; 
} 
else 
{ 
    myDict.Add(key, value); 
} 

Вы можете обернуть это в методе, если вы как:

void AddOrUpdate(Dictionary<string, string> dict, string key, string value) 
{ 
    if (dict.ContainsKey(key)) 
    { 
     dict[key] = value; 
    } 
    else 
    { 
     dict.Add(key, value); 
    } 
} 

//usage: 
AddOrUpdate(myDict, "some key here", "your value"); 

Вы также можете использовать метод TryGetValue но не могу видеть очевидное преимущество в этом.

+2

Возможно, мне что-то не хватает, но dict [key] = значение добавляет или обновляет значение (набор вызывает «private void Insert (ключ TKey, значение TValue, bool add)»). – user276648

+0

@ user276648 Я был тем, кому не хватало большого куска смысла, ты совершенно прав! Раньше я работал со словарями в классическом ASP и предполагал, что синтаксис просто застрял. Не стесняйтесь публиковать новый ответ таким простым способом, чтобы другие узнали установщика. –

3

Ваш псевдо-код является правильным.

public void Process(bool add, Dictionary<string, string> dictionary) 
{ 
    if(add) dictionary.Add("added", "value"); 
} 

вы можете также использовать метод расширения:

static class Program 
{ 
    public static void AddIfNotNull(this Dictionary<string,object> target, string key, object value) 
    { 
     if(value != null) 
      target.Add(key, value); 
    } 

    static void Main(string[] args) 
    { 
     var dictionary = new Dictionary<string, object>(); 

     dictionary.AddIfNotNull("not-added", null); 
     dictionary.AddIfNotNull("added",  "true"); 

     foreach(var item in dictionary) 
      Console.WriteLine(item.Key); 

     Console.Read(); 
    } 

} 
+0

+1 для метода расширения, не думал об этом. :) –

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