Самый быстрый способ получить отдельные списки, используя linq / lambdas - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть List<Dictionary<String, String>> dictionaries. Каждый словарь будет содержать следующие ключи - WAP, SystemCode и SubSystemCode. System принадлежит WAP, а Subsystem принадлежит System. Вот пример данных, которые вы можете увидеть:

WAP | System | Subsystem
-------------------------  
01  | 01     | 01
01  | 02     | 02
02  | 01     | 01
02  | 01     | 02
02  | 03     | 02
03  | 02     | 01

Я хочу получить следующее:

  • Отдельный список всех кодов WAP.

    Я думаю, что var waps = dictionaries.Select(d => d["WAP"]).Distinct(); должно работать для этого.

  • Отдельный список всех системных кодов для каждого кода WAP.

    Должно работать следующее:

    var dictionaryGroups = dictionaries.GroupBy(d => d["WAP"]);
    
    foreach (var dictionaryGroup in dictionaryGroups )
    {
       var wapNo = dictionaryGroup.Key;
       var systemCodes = dictionaryGroup.Select(d => d["SystemCode"]).Distinct();
       ...
    }
    
  • Отдельный список всех кодов подсистем для каждого кода системы для каждого кода WAP.

    Не уверен насчет этого.

Может кто-нибудь помочь мне с последним? И не стесняйтесь, дайте мне знать, если есть лучший способ сделать первые два.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2011
// linq expression
var dist = from d in dictionaries
           group d by new { WAP = d["WAP"], System = d["System"] } into g
           select g.FirstOrDefault();

//lambdas
var dist = dictionaries
              .GroupBy(d => new { WAP = d["WAP"], System = d["System"] })
              .Select(g => g.FirstOrDefault())
0 голосов
/ 22 ноября 2011

Я попытался выполнить следующий запрос linq в LINQPad , и конечный результат должен содержать ответы на все три вопроса.

Посмотрите, хотите ли вы этого.Я использовал вложенный оператор GroupBy Linq.

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


var dictionaries = new [] {
    new { WAP = "1", System = "1", Subsystem = "1"},
    new { WAP = "1", System = "2", Subsystem = "2"},
    new { WAP = "2", System = "1", Subsystem = "1"},
    new { WAP = "2", System = "1", Subsystem = "2"},
    new { WAP = "2", System = "3", Subsystem = "2"},
    new { WAP = "3", System = "2", Subsystem = "1"}
};

var query = 
    from d in dictionaries
    group d by d.WAP into wapGroup 
    select new { 
        WAP = wapGroup.Key,
        SystemGroup = 
            from s in wapGroup
            group s by s.System into systemGroup
            select new {
                System = systemGroup.Key,
                SubsystemGroup = 
                    from s in systemGroup
                    group s by s.Subsystem into subsystemGroup
                    select  new {
                        SubSystem = subsystemGroup.Key
                    }
            }
    };

query.Dump();

Результат в LINQPad показан ниже:

enter image description here

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