Schnellste Möglichkeit, mit linq / lambdas unterschiedliche Listen zu erhalten

  • Ich habe ein List<Dictionary<String, String>> dictionaries. Jedes Wörterbuch enthält die folgenden Schlüssel - WAP, SystemCode und SubSystemCode. Ein System gehört zu einem WAP und ein Subsystem gehört zu einem System. Ein Beispiel für die Daten, die Sie möglicherweise sehen, ist folgende:

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

    Ich möchte im Wesentlichen Folgendes erhalten:

    • Eine eindeutige Liste aller WAP-Codes.

      Ich denke dass var waps = dictionaries.Select(d => d["WAP"]).Distinct(); dafür funktionieren sollte.

    • Eine eindeutige Liste aller Systemcodes für jeden WAP-Code.

      Folgendes sollte funktionieren:

       var dictionaryGroups = dictionaries.GroupBy(d => d["WAP"]);
      
      foreach (var dictionaryGroup in dictionaryGroups )
      {
         var wapNo = dictionaryGroup.Key;
         var systemCodes = dictionaryGroup.Select(d => d["SystemCode"]).Distinct();
         ...
      }
       
    • A Verschiedene Liste aller Subsystemcodes für jeden Systemcode für jeden WAP-Code.

      Unsicher bei diesem Code.

    • ul>

      Kann mir jemand beim letzten helfen? Und lassen Sie mich gerne wissen, ob es einen besseren Weg gibt, die ersten beiden auch zu erledigen.

    22 November 2011
    dnatoli
2 answers
  •  // 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())
     
    22 November 2011
    Luke Schafer
  • Ich habe die folgende linq-Abfrage in LINQPad ausprobiert und das Endergebnis sollte die Antworten enthalten für alle drei fragen.

    Prüfen Sie, ob Sie dies wünschen. Ich habe verschachtelte GroupBy Linq-Operator verwendet.

    Um die Beispielabfrage zu vereinfachen, habe ich nur ein flaches Array verwendet, um die oben gezeigten Daten darzustellen. Sie sollten in der Lage sein, die Beispielabfrage unten zu optimieren, um sie auf das eigentliche Wörterbuchobjekt anzuwenden.

     
    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();
     

    Das Ergebnis in LINQPad wird unten angezeigt:

    Schnellste Möglichkeit, mit linq / lambdas unterschiedliche Listen zu erhalten

    22 November 2011
    Chansik Im