将 IEnumerable<WebSocketHandler> 转换为 WebSocketCollection

Posted

技术标签:

【中文标题】将 IEnumerable<WebSocketHandler> 转换为 WebSocketCollection【英文标题】:convert IEnumerable<WebSocketHandler> to WebSocketCollection 【发布时间】:2016-03-25 10:37:15 【问题描述】:

我正在为一个应用使用Microsoft.Web.WebSockets

我有一组用户WebSocketCollection group;,我需要向除一个以外的所有人发送消息

 group.Except(group.Where(r=>((MicrosoftWebSockets)r).user_id==1)).Broadcast("Message");

但是当我使用 except 子句WebSocketCollection 变成IEnumerable&lt;WebSocketHandler&gt; 然后我不能使用广播方法。

任何其他方法都会有所帮助。

【问题讨论】:

这项工作可以((WebSocketCollection)group.Except(group.Where(r=&gt;((MicrosoftWebSockets)r).user_id==1))).Broadcast("Message") 我在强制转换时遇到此错误无法将类型“d__72`1[Microsoft.Web.WebSockets.WebSocketHandler]”的对象转换为类型“Microsoft.Web.WebSockets.WebSocketCollection”。 【参考方案1】:

Broadcast 方法是在 WebSocketCollection 类上定义的。当您在 WebSocketCollection 上应用 LINQ 查询时,您会得到一个没有 Broadcast 方法的 IEnumerable&lt;WebSocketHandler&gt;

您可以创建一个新的WebSocketCollection,然后使用Add 方法添加各个项目,如下所示:

var handlers = group.Except(group.Where(r=>((MicrosoftWebSockets)r).user_id==1));

var collection = new WebSocketCollection();

foreach(var item in handlers)

    collection.Add(item);


collection.Broadcast("Message");

您可以将此逻辑包装到这样的扩展方法中:

public static class ExtentionMethods

    public static WebSocketCollection ToCollection(this IEnumerable<WebSocketHandler> handlers)
    
        var collection = new WebSocketCollection();

        foreach (var item in handlers)
        
            collection.Add(item);
        

        return collection;
    

并像这样使用它:

group.Except(group.Where(r=>((MicrosoftWebSockets)r).user_id==1))
.ToCollection()
.Broadcast("Message");

顺便说一句,您的 LINQ 查询可以通过否定这样的条件以更好的方式完成:

group.Where(r=> !(((MicrosoftWebSockets)r).user_id == 1))
.ToCollection()
.Broadcast("Message");

【讨论】:

感谢您的回复,我确实想过迭代元素,但每次触发事件时在大组中迭代时不会影响性能 您应该衡量性能影响。很可能它会被忽略。 所以除了将它们设为 WebSocketCollection 之外,我还可以在循环本身中单独发送消息? 是的。这也是一种选择。

以上是关于将 IEnumerable<WebSocketHandler> 转换为 WebSocketCollection的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

为啥我不能将 List<List<Foo>> 传递给 IEnumerable<IEnumerable<Foo>>

将 IEnumerable<T> 转换为 List<T>

将 DataTable 转换为 IEnumerable<T>

将 DataRowCollection 转换为 IEnumerable<T>