Linq:从字典中选择KeyValuePair,其中value是对象列表

时间:2018-08-24 23:27:11

标签: c# linq

我有一个看起来像这样的字段

public Dictionary<ClassA, List<ClassB>> MyDict;

假设:

public class ClassA 
{
    public string Name;
    public int Id;
 }

public class ClassB 
{
    public string Tag;
    public string Text;
 }

我正在尝试定义IEnumerable<KeyValuePair<ClassA,IEnumerable<ClassB>>类型的查询,在其中我对ClassB.Tag的值定义条件。我尝试过类似的事情:

IEnumerable<KeyValuePair<ClassA,IEnumerable<ClassB>> q =
    MyDict.Where(pair => pair.Value.Any(b => b.Tag == "a tag"));

但是显然以上不是我所需要的,因为如果任何项与该条件匹配,它将返回整个List<ClassB>,而我想要返回的是IEnumrableList个符合条件的项目。

1 个答案:

答案 0 :(得分:3)

dotNetFiddle demo

您需要从对ToDictionary的调用中构造IEnumerable,在该投影中,使用投影仅从列表中获取匹配的BClass,而仅从该集合中的结果实际匹配BClass列表中的值。

IEnumerable<KeyValuePair<ClassA,List<ClassB>>> q = MyDict.ToDictionary(
    k => k.Key, 
    k => k.Value.Where(b => b.Tag == "10").ToList()
).Where(kv => kv.Value.Any());