Skip to main content
 首页 » 编程设计

c#之将 IEnumerableWebSocketHandler> 转换为 WebSocketCollection

2024年05月06日38tuyile006

我正在使用 Microsoft.Web.WebSockets对于一个应用程序。

我有一个用户集合WebSocketCollection group;我需要向除了一个人之外的所有人发送消息

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

但是我使用 Except 子句的那一刻 WebSocketCollection变成 IEnumerable<WebSocketHandler>然后我不能使用广播方法。

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

请您参考如下方法:

Broadcast方法在 WebSocketCollection 上定义类(class)。在 WebSocketCollection 上应用 LINQ 查询时你得到一个IEnumerable<WebSocketHandler>没有 Broadcast方法。

您可以创建一个新的 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");