2016-03-25 13 views
1

I Microsoft.Web.WebSockets für eine App verwenden.konvertieren IEnumerable <WebSocketHandler> zu WebSocketCollection

Ich habe eine Sammlung von Benutzern WebSocketCollection group; und ich brauche Nachricht mit einer Ausnahme an alle senden

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

Aber in dem Moment i WebSocketCollection wird IEnumerable<WebSocketHandler> Außer-Klausel verwenden, und dann kann ich nicht Broadcast-Methode verwenden.

Jeder andere Ansatz wäre hilfreich.

+0

wird diese Arbeit '((WebSocketCollection) group.Except (group.Where (r => ((MicrosoftWebSockets) r) .user_id == 1))). Broadcast ("Message") ' –

+0

ich diese Fehlermeldung erhalten, während kann nicht Gussobjekt von Typ ' d__72'1 [Microsoft.Web.WebSockets.WebSocketHandler]' eingeben‚Microsoft .Web.WebSockets.WebSocketCollection '. – deepakgates

Antwort

3

Broadcast Die Methode basiert auf der WebSocketCollection Klasse definiert. Wenn Sie eine LINQ-Abfrage auf WebSocketCollection anwenden, erhalten Sie eine IEnumerable<WebSocketHandler>, die eine Broadcast-Methode nicht aufweist.

Sie können einen neuen WebSocketCollection erstellen und fügen Sie dann die einzelnen Positionen der Add Methode wie folgt verwendet:

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"); 

Sie diese Logik in eine Erweiterung Methode wie folgt wickeln könnte:

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; 
    } 
} 

Und Verwenden Sie es wie folgt:

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

Durch die w ay, Ihre LINQ-Abfrage kann durch Negieren des Zustandes, wie dies in einer besseren Art und Weise erfolgen:

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

Danke für die Antwort, ich habe über die Iteration der Elemente nachgedacht, aber es wird die Leistung nicht beeinflussen, wenn ich jedes Mal, wenn das Ereignis ausgelöst wird, in großen Gruppen iteriere – deepakgates

+0

Sie sollten die Auswirkungen auf die Leistung messen. Höchstwahrscheinlich wird es vernachlässigbar sein. –

+1

also, anstatt sie eine WebSocketCollection zu machen, kann ich auch einfach Nachricht einzeln in der Schleife selbst senden? – deepakgates

Verwandte Themen