使用linq/lambdas获取不同列表的最快方法
我有一个List<Dictionary<String, String>> dictionaries
。每个词典将包含以下键 - WAP
,SystemCode
和SubSystemCode
。 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代码中的每个系统代码的所有子系统代码的不同列表。
不确定这件事。
有人可以帮我解决最后一个问题吗?如果还有更好的方法来完成前两项,请随时告诉我。
// 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())
这实际上是第二步的解决方案,而不是第三步,因为如果只将第一个拉出组,那么选择意味着将第一个拉出组,因此会丢失具有不同子系统的所有组件。但是你让我找到了最终的解决方案 - “字典”。GroupBy(d => new {WAP = d [“WAP”],System = d [“SystemCode”],Subsystem = d [“SubSystemCode”]})。选择(g => g.FirstOrDefault())'toush' – link664
touche 。很高兴我可以帮助 –
我尝试以下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如下图所示:
所以要:为WAP /系统的每个组合,给我各子系统?你想把WAP /系统作为结果的一部分吗? –
是的,这将是有益的,因为我需要这些值进行搜索。 – link664
匿名类型自动实现'Equals()'和'GetHashCode()',所以如果你使用'GroupBy(d => new {WAP = d [“WAP”],SystemCode = d [“SystemCode”]})'最后一个应该类似于第二个。 – millimoose