如何从值列表的字典键查询中获取展平列表?

时间:2016-07-28 18:20:59

标签: c# linq dictionary

我正在尝试创建一个事件/消息系统,订阅者可以订阅常规事件类型或特定事件类型。

我有一个事件类型字典,其中包含所述类型的订阅者列表,并且,为了将事件通知给订阅者,我想获得这些列表中所有订阅的扁平列表,其中订阅的类型是等于或可从事件的类型分配;换句话说,当字典键符合标准时。

如何获取从字典键中查询的列表项目的扁平列表(使用linq)?

我的WIP代码:

private Dictionary<Type, List<SomeEventDelegate>> subscriptions;

// ...other code...

public void Dispatch(SomeEvent someEvent)
    {
        // This should get the Key-Value pairs... How do I get a flattened list of all items in the values (which are lists themselves)?
        List<SomeEventDelegate> subscribers =
            from subscription in subscriptions
            where subscription.Key.IsAssignableFrom(someEvent.GetType())
            select subscription;

        //After I have the flattened list, I will dispatch the event to each subscriber here, in a foreach loop.
    }

2 个答案:

答案 0 :(得分:2)

SelectMany应该做的工作:

List<SomeEventDelegate> subscribers =
    subscriptions.Where(kvp => 
        kvp.Key.IsAssignableFrom(someEvent.GetType())
    ).SelectMany(kvp => kvp.Value)
    .ToList();

您只能使用chained-method-call语法执行此操作。你传递一个从参数中选择IEnumerable<T>的lambda,然后它将它从查询中的每个项目收集的所有枚举合并到一个大的平面查询中,然后返回它。

答案 1 :(得分:1)

如果您更喜欢查询语法(因此不必担心使用的确切方法),为什么不继续查询:

   List<SomeEventDelegate> subscribers =
        (from subscription in subscriptions
         where subscription.Key.IsAssignableFrom(someEvent.GetType())
         from subscriber in subscription.Value
         select subscriber)
        .ToList();