VB.Net中如何使用System.Linq替代循环实现从嵌套List生成以子列表索引为键的Dictionary
使用LINQ简化VB.NET字典构建逻辑
当然可以用LINQ来实现这个需求,而且还能修正你原代码里的一个小错误(你最后一行写的legendElements.add(element)是不对的,应该是往对应索引的列表里添加元素:legendElements(i).Add(element))。
用LINQ的话,一行代码就能完成整个逻辑,而且代码更简洁易读:
Dim legendElements As Dictionary(Of Integer, List(Of Element)) = _elements _ .Select(Function(subList, index) New With {.Index = index, .Legends = subList.OfType(Of Legend)().ToList()}) _ .ToDictionary(Function(item) item.Index, Function(item) item.Legends)
代码解释:
Select(Function(subList, index) ...):这里用带索引的重载,同时获取每个子列表及其对应的索引,这正是我们需要的字典Key。subList.OfType(Of Legend)():直接筛选出子列表中所有Legend类型的元素,这个方法比手动用GetType()判断更简洁,而且会自动处理类型兼容(因为Legend继承自Element,转成List(Of Element)完全没问题)。ToDictionary(...):把前面生成的匿名对象直接转换成字典,用Index作为Key,筛选后的Legends列表作为Value。
这个实现和你原代码的行为完全一致:
- 每个子列表的索引都会作为字典的Key
- 如果某个子列表里没有
Legend元素,对应的Value就是空的List(Of Element) - 不需要提前循环初始化字典里的空列表,LINQ会自动帮我们生成对应的列表
内容的提问来源于stack exchange,提问作者tval
相关产品推荐
相关产品推荐

