将 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<WebSocketHandler>
然后我不能使用广播方法。
任何其他方法都会有所帮助。
【问题讨论】:
这项工作可以((WebSocketCollection)group.Except(group.Where(r=>((MicrosoftWebSockets)r).user_id==1))).Broadcast("Message")
我在强制转换时遇到此错误无法将类型“Broadcast
方法是在 WebSocketCollection
类上定义的。当您在 WebSocketCollection
上应用 LINQ 查询时,您会得到一个没有 Broadcast
方法的 IEnumerable<WebSocketHandler>
。
您可以创建一个新的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>>