Опрос вложенных словарей с использованием LINQ - PullRequest
1 голос
/ 14 января 2010

Я разрабатываю систему POS, и мне нужно проверить, не синхронизированы ли таблицы базы данных на каждом терминале.

Я веду словарь информации терминала, каждый из которых имеет словарь, содержащий идентификаторы таблиц с CRC для каждой таблицы. Ниже приведено упрощенное описание того, что я получил до сих пор (я использую VB.NET, но я упустил много вещей, чтобы, надеюсь, прояснить ситуацию):

e.g.   TerminalList = Dictionary(Of Integer, TerminalInfo)

       class TerminalInfo
         TerminalID: Integer
         TableCRCs: Dictionary(Of String, TableInfo)

       class TableInfo
         TableID: String
         CRC: UInt32


       TerminalID: 1
          TableID: A   CRC: aa10
          TableID: B   CRC: 1234

       TerminalID: 2
          TableID: A   CRC: aa10
          TableID: B   CRC: 1234

       TerminalID: 3
          TableID: A   CRC: 12be
          TableID: B   CRC: 1234

Могу ли я создать запрос LINQ, который будет составлять список различных идентификаторов таблиц и CRC?

i.e. A  aa10
     A  12be
     B  1234

Если количество запросов больше, чем количество интересующих меня таблиц, тогда я знаю, что терминал не синхронизирован. Меня не интересует, какой терминал или какая таблица не синхронизированы, только в том, что есть разница.

ТИА,

Simon

1 Ответ

2 голосов
/ 14 января 2010

Конечно. Вы не указали язык, поэтому я надеюсь, что с C # все в порядке (я не бегло говорю на VB.NET, но могу помочь, если вам нужна помощь в переводе):

var query = TerminalList.SelectMany(kvp => kvp.Value.TableCRCs.Values)
                        .GroupBy(info => new { info.TableID, info.CRC });

foreach (var result in query) {
    Console.WriteLine(
        String.Format(
            "{0}|{1:x}",
            result.Key.TableID,
            result.Key.CRC
        )
    );
}

Ключом к этому является использование SelectMany для объединения вложенных перечислений TerminalInfo в одно перечисление. Оттуда это просто обычная операция GroupBy для получения желаемого результата.

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