Вложенные словари: Я использую правильную структуру данных [duplicate]

1) Определите короткую хэш-запись фиксации

# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....

2) Если вы хотите скворовать (объединить) последние две фиксации

# git rebase -i deab3412 

3) Это открывает кнопку nano для слияния. И это выглядит ниже

....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....

4) Переименуйте слово pick в squash, которое присутствует перед abcd1234. После переименования он должен выглядеть следующим образом.

....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....

5) Теперь сохраните и закройте редактор nano. Нажмите ctrl + o и нажмите Enter для сохранения. И затем нажмите ctrl + x, чтобы выйти из редактора.

6) Затем редактор nano снова открывается для обновления комментариев, при необходимости обновляет его.

7) Теперь его сжатие успешно, вы можете проверить его, проверив журналы.

# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....

8) Теперь нажмите на репо. Примечание, чтобы добавить знак + перед именем ветки.

# git push origin +master

Примечание. Это основано на использовании git на оболочке ubuntu. Если вы используете разные os (Windows или Mac), то выше команды такие же, кроме редактора. Вы можете получить другой редактор.

17
задан Iain Fraser 16 February 2012 в 04:22
поделиться

3 ответа

Я предлагаю другой выбор:

Dictionary<Tuple<string, string, string>, string> pt;

Доступ к словарю:

pt[Tuple.Create("id","group","part")]

UPDATE:

Значения Tuples , введенные в C # 7, наиболее привлекательны:

Dictionary<(string id, string group, string part), string> pt;

Доступ к словарю:

pt[("id", "group", "part")]
15
ответ дан Reza ArabQaeni 27 August 2018 в 08:38
поделиться

Я хотел бы предложить альтернативный подход, используя SortedDictionary и пользовательский сопоставитель:

    public class PrerenderedTemplate
    {
        public string instanceID;
        public string templategroup;
        public string templatepart;

        public PrerenderedTemplate(string id, string tempGroup, string tempPart)
        {
            instanceID = id;
            templategroup = tempGroup;
            templatepart = tempPart;
        }

        // custom comparer instance used as argument 
        // to SortedDictionary constructor
        public class Comparer : IComparer<PrerenderedTemplate>
        {
            public int Compare(PrerenderedTemplate x, PrerenderedTemplate y)
            {
                int compare = 0;
                if (compare == 0) compare = x.instanceID.CompareTo(y.instanceID);
                if (compare == 0) compare = x.templategroup.CompareTo(y.templategroup);
                if (compare == 0) compare = x.templatepart.CompareTo(y.templatepart);
                return compare;
            }
        }
    }

Используется так:

    var dictionary = new SortedDictionary<PrerenderedTemplate, string>(new PrerenderedTemplate.Comparer());

    dictionary.Add(new PrerenderedTemplate("1", "2", "3"), "123");
    dictionary.Add(new PrerenderedTemplate("4", "5", "6"), "456");
    dictionary.Add(new PrerenderedTemplate("7", "8", "9"), "789");

    Assert.AreEqual<string>(dictionary[new PrerenderedTemplate("7", "8", "9")], "789");

Ответ RezaArab подходит для но лично мне не нравятся кортежи на основе их неоднозначных свойств и подробного синтаксиса.

Пользовательский класс с компаратором предлагает большую ясность и гибкость при любых изменениях требований.

0
ответ дан mungflesh 27 August 2018 в 08:38
поделиться

Я бы создал пользовательский словарь. Что-то вроде этого

public class TrippleKeyDict
{
    private const string Separator = "<|>";
    private Dictionary<string, string> _dict = new Dictionary<string, string>();

    public string this[string key1, string key2, string key3]
    {
        get { return _dict[GetKey(key1, key2, key3)]; }
        set { _dict[GetKey(key1, key2, key3)] = value; }
    }

    public void Add(string key1, string key2, string key3, string value)
    {
        _dict.Add(GetKey(key1, key2, key3), value);
    }

    public bool TryGetValue(string key1, string key2, string key3, out string result)
    {
        return _dict.TryGetValue(GetKey(key1, key2, key3), out result);
    }

    private static string GetKey(string key1, string key2, string key3)
    {
        return String.Concat(key1, Separator, key2, Separator, key3);
    }
}

Если вы считаете, что конкатенация строк недостаточно безопасна, поскольку ключи могут содержать разделители, тогда используйте свой собственный тип ключа или ключ Touple<string,string,string>. Поскольку эта деталь реализации скрыта внутри вашего пользовательского словаря, вы можете изменить ее в любое время.

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

var dict = new TrippleKeyDict();

// Using the Add method
dict.Add(instanceID, templategroup, templatepart, "some value");

// Using the indexer
dict[instanceID, templategroup, templatepart] = "xy";
string result = dict[instanceID, templategroup, templatepart];

// Using the TryGetValue method
if (dict.TryGetValue(instanceID, templategroup, templatepart, out result)) {
    // Do something with result
}
1
ответ дан Olivier Jacot-Descombes 27 August 2018 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: