如何编写LINQ表达式,从字典的各列表值中返回所有特定类型元素?
从字典的列表值中筛选所有特定子类元素的LINQ实现
我有一个字典结构,键类型为IntBound,值是包含自定义类StructureData的列表,定义如下:
private readonly Dictionary<IntBound, List<StructureData>> structuresDataCollection;
HouseStructureData是StructureData的子类。之前我用这段代码返回每个列表中第一个HouseStructureData类型的元素:
public IEnumerable<StructureData> GetAllHousesData() { return structuresDataCollection.Where(s => s.Value.FirstOrDefault() is HouseStructureData).Select(s => s.Value.FirstOrDefault()); }
现在需要修改LINQ表达式,从每个列表(Value)中返回所有HouseStructureData类型的元素。
解决方案
可以利用SelectMany扁平化多个列表的结果,结合OfType或Where来筛选指定类型元素:
方案1:返回精确的子类类型(推荐)
这种方式直接返回HouseStructureData类型,类型更精确,无需后续强制转换:
public IEnumerable<HouseStructureData> GetAllHousesData() { return structuresDataCollection.Values .SelectMany(list => list.OfType<HouseStructureData>()); }
方案2:保持原返回类型(StructureData)
如果需要和原方法返回类型一致,返回StructureData基类:
public IEnumerable<StructureData> GetAllHousesData() { return structuresDataCollection.Values .SelectMany(list => list.Where(item => item is HouseStructureData)); }
代码说明
structuresDataCollection.Values:直接获取字典中所有的列表集合,无需处理键,简化逻辑SelectMany:将多个列表的筛选结果合并成一个单一的序列,避免返回嵌套的集合类型OfType<HouseStructureData>():LINQ内置的类型筛选方法,自动过滤并转换为目标类型,简洁高效Where(item => item is HouseStructureData):手动判断元素类型,适合需要额外条件的场景
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

