(抱歉英文不好)
我有两个数组。首先是“旧”,接下来是“新”。 当有人登录/退出我的程序服务器时,会发出新阵列。
例如旧数组是{“Thomas”,“Eliza”},新数组只有{“Thomas”}。现在我想找到已被更改的内容(并将其广播为“Eliza已被注销”)
所以从这两个数组中我想得到接下来的两个像Removed和Added。
示例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 :(得分: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 ");
答案 1 :(得分:0)
播放"用户X已退出"似乎很愚蠢。登录用户数组发生更改时的消息,因为您需要不断地比较两个阵列。用户已经注销的消息将被重复,因为您将保留一个旧的"的常量副本,填充注册用户和不断变化的"新"这需要与旧的检查。
让我们说我们有用户Brian,Jack,John和Lisa,我们的数组看起来像这样:
Users[Brian, Jack, John, Lisa]
LoggedIn[Brian, Jack, John, Lisa]
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"
消息" Lisa已退出"已被播放两次,因为我们必须比较数组并找出谁失踪。这是处理此类通知的一种不好方法,因为您每次比较时都会创建重复项。
相反,请考虑创建一个方法来处理用户何时注销并从按钮单击调用:
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数组。