Объединение сложных словарей в C # .net путем написания универсальной рекурсивной функции - PullRequest
2 голосов
/ 17 июля 2010

У меня есть два сложных словаря в форме

Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>>

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

Немного подробного объяснения

Этот словарь содержит СПИСОК СООБЩЕНИЙ, отправленных ПОЛЬЗОВАТЕЛЕМ в чате в КОНКРЕТНОЙ ГРУППЕ ЧАТКОНКРЕТНЫЙ ПОЛЬЗОВАТЕЛЬ (прочитайте предложение и интерпретируйте словарь с конца).Итак, у меня есть два словаря этой формы.Как только я отправляю сообщение пользователю, я удаляю его из словаря.Но я хочу иметь историю сообщений.Поэтому, прежде чем удалить его, я просто делаю копию, добавляя ее в другой архив, который содержит все сообщения во всех сеансах чата, от всех пользователей, до всех пользователей до сих пор!

Примечание: я не благословил использовать LINQ .

Спасибо

NLV

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Если я осмелюсь быть настолько смелым, то использование словарей таким образом создаст крайне не поддерживаемый код.

ИМХО, следующая структура классов или аналогичная будет намного, намного проще для понимания и работы.

public class User {
  public string Name {get;set;}

  // Sessions this user is participating in
  // (when you add to Session, add here too - Using a method to add both at same would be safest)
  public List<Session> Sessions {get;set;}

  // etc
}

public class Message {
  public User Sender {get;set;}
  public string Text {get;set;}
  // etc
}

public class Session {
  public string Title {get;set;}
  public List<User> Participants {get;set;}
  public List<Message> SentMessages {get;set;}
  public List<Message> UnsentMessages {get;set;}
}

public class ChatSystem {
   // All Users - Indexed by Name
   public Dictionary<string, User> Users {get; set;}

   // All Sessions - Indexed by Title
   public Dictionary<string, Session> Sessions {get; set;}
}

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

Естьвесело!

1 голос
/ 17 июля 2010

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

Итак, объявление вашего метода будет выглядеть примерно так:

// Merges b into a
void Merge<T>(T a, T b) where T : IDictionary

Затем повторите каждую запись b. Если ключ не существует в a, добавьте kvp к a и продолжите итерацию. Если значение is IDictionary, тогда передайте значение a и значение b рекурсивно Merge. В противном случае, если оно is ICollection, то объединить его значения в коллекцию в a. В противном случае ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...