Можете ли вы иметь более 2 элементов в коллекции Dictionary или другой тип коллекции? - PullRequest
2 голосов
/ 09 марта 2009

Я сомневаюсь, что это возможно, но мне было любопытно, если бы вы могли иметь более 2 элементов (ключ, значение) в словаре. Может быть ключ и 2 значения. Есть ли объект коллекции, который позволяет это? Что я на самом деле пытаюсь сделать, так это сохранить ключ и значение для ключа, а также другое значение для хранения количества раз, когда ключ был найден. Например, у меня может быть цикл for, который проходит через список цветов, и каждый цвет имеет уникальное значение. Просматривая список, я не только хочу сохранить цвет, уникальное значение цвета в словаре, но и сохранить, сколько раз красный встречался в списке.

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

Dictionary<string, Dictionary<int,int>> colors = 
                          new Dictionary<string, Dictionary<int,int>>();

Вот код того, как я обращался с ним раньше:

Dictionary<string, int> colors = new Dictionary<string, int>();

 foreach (Color color in ColorList)
        {
            if (colors.ContainsKey(color.ToString()))
                colors[color]++;
            else
                colors.Add(color, 1);
        }

Ответы [ 9 ]

7 голосов
/ 09 марта 2009

Вы можете создать простой класс Tuple, например Triple. По сути, это словарь с общими ключами, но содержит дополнительный объект. В этом сценарии довольно часто люди создают библиотеки, расширяющие его до 4-10 объектов. Вот пример:

    public struct Triple<X, Y, Z>
    {
        public X First;     
        public Y Second;    
        public Z Third;     

        public Triple(X x, Y y, Z z)
        {
            First = x;
            Second = y;
            Third = z;
        }
    }

А затем используйте его так:

 var myTriple =  new Triple<string, Color, int>(
                        "key", 
                        myColor, 
                        count
                    )

4 голосов
/ 09 марта 2009

Не могли бы вы иметь словарь структуры, которая будет отслеживать цвет и количество раз, когда это произошло?

Редактировать: Как и предполагалось в другом месте, это также может быть достигнуто путем создания собственного небольшого пользовательского класса. По сути, будет работать таким же образом.

3 голосов
/ 09 марта 2009

Вы можете использовать два словаря для этого или просто создать класс данных, который имеет и цвет, и количество, и сохранить экземпляры промежуточного класса в словаре.

2 голосов
/ 09 марта 2009

Ну, одним из способов было бы:

Dictionary<key, KeyValuePair<value, int>>

Если я понимаю ваш вопрос.


Edit:

На самом деле, если цвет и значение были согласованы - это означает, что «красный» всегда был 3 или 19 или что вы использовали в качестве значения красного, то имя «красный» и значение, скажем, 19, на самом деле просто составной ключ, и вы можете сделать что-то вроде этого:

Dictionary<KeyValuePair<string, int>, int> mydict;

и затем для обновлений сделайте что-то вроде этого:

mydict[key] = mydict[key] + 1;
1 голос
/ 24 марта 2014

Начиная с C # 4.0 существует класс Tuple , который предоставляет статические методы для создания объектов кортежа.

См .: http://msdn.microsoft.com/en-us/library/system.tuple.aspx

// Create a 7-tuple. 
var population = new Tuple<string, int, int, int, int, int, int>(
                           "New York", 7891957, 7781984, 
                           7894862, 7071639, 7322564, 8008278);
// Display the first and last elements.
Console.WriteLine("Population of {0} in 2000: {1:N0}",
                  population.Item1, population.Item7);
// The example displays the following output: 
//       Population of New York in 2000: 8,008,278 
//       Population of New York in 2000: 8,008,278
0 голосов
/ 22 августа 2018

Словарь> KeyValuePair = новый словарь> ();

KeyValuePair.Add ("LoadType", новый список {"PassiveLoad", "SocketLoad"});

0 голосов
/ 09 марта 2009

Большинство из этих ответов говорят почти одно и то же (правильное). Просто сделайте значение вашего «внешнего» словаря каким-то объектом, который вы считаете наиболее полезным для выполнения того, что вам нужно. Лично, не думая об этом, я бы пошел со словарем словаря.

Dictionary<key1, Dictionary<key2, value>>
0 голосов
/ 09 марта 2009

не могли бы вы сделать что-то вроде

Dictonary<string,string> dh = new dictonary<string,string>();

dh.add("x","Something:0");


foreach keyvaluepair kvp in dh
{

    if kvp.key == x
    {
        string[] hold= kvp.value.split(':');
        //to update it the count it would be something like

        int y = convert.toint(hold[1])+1;
        kvp.value=hold[0]+":"+y.tostring();

     }

}
0 голосов
/ 09 марта 2009

Вы ищете MultiMap.

Я написал следующее (не полностью протестировано):

 using System.Collections.Generic;

public class MultiMapSet<TKey, TValue>
{
    private readonly Dictionary<TKey, HashSet<TValue>> _ht = new Dictionary<TKey, HashSet<TValue>>();

    public void Add(TKey key, TValue value)
    {
        HashSet<TValue> valueSet;
        if (_ht.TryGetValue(key, out valueSet))
        {
            valueSet.Add(value);
        }
        else
        {
            valueSet = new HashSet<TValue> { value };
            _ht.Add(key, valueSet);
        }
    }

    public bool HasValue(TKey key, TValue value)
    {
        HashSet<TValue> valueSet;
        if (_ht.TryGetValue(key, out valueSet))
        {
            return valueSet.Contains(value);
        }
        return false;
    }

    public HashSet<TValue> GetValues(TKey key)
    {
        HashSet<TValue> valueSet;
        _ht.TryGetValue(key, out valueSet);
        return valueSet;
    }

    public void Remove(TKey key, TValue value)
    {
        HashSet<TValue> valueSet;
        if (!_ht.TryGetValue(key, out valueSet))
        {
            return;
        }

        if (valueSet.Contains(value))
        {
            valueSet.Remove(value);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...