You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:51:06