web-dev-qa-db-ja.com

値として文字列のリストを持つ辞書

私の値がリストである辞書があります。キーを追加するときに、キーが存在する場合、値に別の文字列を追加します(リスト)?キーが存在しない場合は値を持つ新しいリストを使用して新しいエントリを作成し、キーが存在する場合はリスト値exに値を追加します。

Dictionary<string, List<string>> myDic = new Dictionary<string, List<string>>();
myDic.Add(newKey, add to existing list<strings> and not create new one)
25
user1186050

これを手動で行うには、次のようなものが必要です。

List<string> existing;
if (!myDic.TryGetValue(key, out existing)) {
    existing = new List<string>();
    myDic[key] = existing;
}
// At this point we know that "existing" refers to the relevant list in the 
// dictionary, one way or another.
existing.Add(extraValue);

ただし、多くの場合、LINQはToLookupを使用してこれを簡単にします。たとえば、List<Person>「姓」から「その姓の名」の辞書に変換したい。次を使用できます。

var namesBySurname = people.ToLookup(person => person.Surname,
                                     person => person.FirstName);
34
Jon Skeet

辞書を別のクラスにラップします。

public class MyListDictionary
{

    private Dictionary<string, List<string>> internalDictionary = new Dictionary<string,List<string>>();

    public void Add(string key, string value)
    {
        if (this.internalDictionary.ContainsKey(key))
        {
            List<string> list = this.internalDictionary[key];
            if (list.Contains(value) == false)
            {
                list.Add(value);
            }
        }
        else
        {
            List<string> list = new List<string>();
            list.Add(value);
            this.internalDictionary.Add(key, list);
        }
    }

}
12
sartoris

辞書に新しい配列を作成するだけです

Dictionary<string, List<string>> myDic = new Dictionary<string, List<string>>();
myDic.Add(newKey, new List<string>(existingList));