2017-06-16 12 views
-1

(悪い英語のため申し訳ありませんが)は、私は2つの配列を持っている/してログアウトし、ユーザー

を検出します。最初は「古い」、次は「新しい」です。 誰かが自分のプログラムのサーバーにログイン/ログアウトすると、新しい配列が送信されます。

たとえば、古い配列は{"Thomas"、 "Eliza"}で、新しい配列は{"Thomas"}のみです。今私は変更されたものを見つけたいと思います(そして、これは "Elizaがログアウトされました"のように放送します)。

したがって、これらの2つの配列から、私は削除と追加のような次の2つを取得します。

例B:(擬似コード)

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 
} 

私はLINQを使用することができます、助けてくれてありがとう!

+0

'Except'はあなたに確か – BradleyDotNET

答えて

1

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

2つの配列を常に比較する必要があるため、ログインしたユーザーの配列が変更されたときに、「ユーザーXがログアウトしました」というメッセージがブロードキャストされているようです。ユーザーがログアウトしたメッセージは、「古い」という一定のコピーを登録ユーザーで満たしていて、古いものに対してチェックする必要のある「新」が常に存在するため、繰り返されます。

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

リサがログアウトし、我々は両方をループすることにより、ユーザーにLOGGEDINを比較し、誰を見つける:

のは、我々はユーザーブライアン、ジャック、ジョンとリサを持っているとしましょう、私たちの配列は次のようになります。 LoggedInと放送で行方不明。

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

Broadcast: "Lisa has logged out" 

次に、Brianがログアウトして同じことを行います。そして、両方のループスルーが欠けている人を見つける:

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

我々はすべてのユーザーをループする必要があるため、放送ますメッセージは以下のとおりです。

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

「リサがログアウトしました」のメッセージが放送されました配列を比較して欠けている人を見つけなければならないので、2度。これは、あなたが比較するたびに重複を作成するため、この種の通知を処理する悪い方法です。

代わりに、ユーザがログアウトし、ボタンのクリックから呼び出されたときに処理するメソッド作成することを検討:

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." 
} 

この方法で、あなたがはるかに容易に管理あなたが持っていないため、ログインしていますユーザーとLoggedInの配列を比較するループを使用します。あなたは次のコードを使用することができます

+0

ないための追加のユーザーを取得することができ、私はその後、私はそれらを比較したい新しい配列でイベントを得た(放送の情報がログに)と古い配列を新しい配列に置き換えてください。何も複製されません。私はそれらを 'while(true){...}'で比較したくない – Enter

関連する問題