2017-06-16 2 views
-1

(Désolé pour le mauvais anglais)Détecter/connecté les utilisateurs

J'ai deux tableaux. Le premier est "ancien" et le suivant est "nouveau". Le nouveau tableau est envoyé lorsque quelqu'un se connecte au serveur de mon programme. Par exemple old array est {"Thomas", "Eliza"} et le nouveau tableau est seulement {"Thomas"}. Maintenant, je veux trouver ce qui a été changé (et diffusé cela comme "Eliza a été déconnecté")

Donc, à partir de ces deux tableaux, je veux obtenir les deux prochains comme supprimé et ajouté.

Exemple B: (pseudocode)

string[] old = {"Thomas", "Eliza"} 
string[] new = {"Thomas", "Eliza", "Beth"} 

string[] added = //magic code 
string[] removed = //magic code 2 

if (added.length > 0) { 
//broadcast logins 
} 
if (removed.length > 0) { 
//broadcast logouts 
} 

Je peux utiliser LINQ, merci pour l'aide!

+0

'Except' pouvez-vous obtenir les utilisateurs ajoutés sûr – BradleyDotNET

Répondre

1

Vous pouvez utiliser le code suivant:

string[] Old= new string[3]{"Thomas", "Eliza","John"}; 
    string[] New= new string[3]{"Thomas", "Eliza", "Beth"}; 
    var intersect = New.Intersect(Old, StringComparer.InvariantCultureIgnoreCase).ToArray(); 
    var loggedIn = New.Where(x=> !intersect.Contains(x)).Select(x=>x).ToList(); 
    var loggedOut = Old.Where(x=> !intersect.Contains(x)).Select(x=>x).ToList(); 
    foreach(var s in loggedIn) 
     Console.WriteLine(s + " has logged in "); 
    foreach(var s in loggedOut) 
     Console.WriteLine(s + " has logged out "); 
0

Il semble stupide de diffuser le message "L'utilisateur X est déconnecté" lorsque le tableau des utilisateurs connectés a changé car vous auriez besoin de comparer les deux tableaux en permanence. Les messages qu'un utilisateur a déconnectés seraient répétés parce que vous garderiez une copie constante de "vieux", rempli d'utilisateurs enregistrés et un "nouveau" toujours changeant qui aurait besoin d'être vérifié par rapport à l'ancien.

Disons que nous avons les utilisateurs Brian, Jack, John et Lisa, nos tableaux se présente comme suit:

Users[Brian, Jack, John, Lisa] 
LoggedIn[Brian, Jack, John, Lisa] 

Lisa se déconnecte et compare LoggedIn aux utilisateurs par une boucle à travers les deux et savoir qui est manquant dans LoggedIn et diffusé.

Users[Brian, Jack, John, Lisa] 
LoggedIn[Brian, Jack, John] 

Broadcast: "Lisa has logged out" 

Ensuite, Brian se déconnecte et nous faisons la même chose. Boucle à travers les deux et savoir qui manque:

Users[Brian, Jack, John, Lisa] 
LoggedIn[Jack, John] 

Parce que nous devons boucle à travers chaque utilisateur, les messages qui se diffusés sont:

"Brian has logged out" 
"Lisa has logged out" 

Le message « Lisa a déconnecté » a été diffusé deux fois parce que nous devons comparer les tableaux et savoir qui a disparu. C'est une mauvaise façon de gérer ce type de notification, car vous créerez des doublons chaque fois que vous comparez.

Au lieu de cela, envisager de créer une méthode qui gère lorsqu'un utilisateur se déconnecte et est appelé à partir d'un bouton clic:

private void btnLogOut_Click(object sender, EventArgs e) 
{ 
    LogOut(user); 
} 

private void LogOut(string username) 
{ 
    //Remove username from LoggedIn array 
    //Broadcast: username + " has logged out." 
} 

De cette façon, vous gérez beaucoup plus facilement qui est connecté parce que vous n'avez pas utiliser des boucles pour comparer des tableaux d'utilisateurs et de connexions.

+0

Non, je suis arrivé un événement avec un nouveau tableau, alors je veux les comparer (informations de diffusion pour ouvrir une session) et remplacez ancien tableau par nouveau ... donc rien ne sera dupliqué. Je ne veux pas les comparer dans 'while (true) {...}' – Enter