2011-11-22 36 views
2

我有一个List<Dictionary<String, String>> dictionaries。每个词典将包含以下键 - WAP,SystemCodeSubSystemCode。 A System属于WAP,并且Subsystem属于System。您可能会看到数据的例子是这样的:使用linq/lambdas获取不同列表的最快方法

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代码中的每个系统代码的所有子系统代码的不同列表。

    不确定这件事。

有人可以帮我解决最后一个问题吗?如果还有更好的方法来完成前两项,请随时告诉我。

+0

所以要:为WAP /系统的每个组合,给我各子系统?你想把WAP /系统作为结果的一部分吗? –

+0

是的,这将是有益的,因为我需要这些值进行搜索。 – link664

+1

匿名类型自动实现'Equals()'和'GetHashCode()',所以如果你使用'GroupBy(d => new {WAP = d [“WAP”],SystemCode = d [“SystemCode”]})'最后一个应该类似于第二个。 – millimoose

回答

3
// 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()) 
+1

这实际上是第二步的解决方案,而不是第三步,因为如果只将第一个拉出组,那么选择意味着将第一个拉出组,因此会丢失具有不同子系统的所有组件。但是你让我找到了最终的解决方案 - “字典”。GroupBy(d => new {WAP = d [“WAP”],System = d [“SystemCode”],Subsystem = d [“SubSystemCode”]})。选择(g => g.FirstOrDefault())'toush' – link664

+0

touche 。很高兴我可以帮助 –

0

我尝试以下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

相关问题