C# 为什么我的阵列';当我将第一项移到末尾时,s的顺序正在更改
我已经做了一个应用程序,它正在存储有关ip的数据。假设我的ip每1分钟改变一次。如果我在添加到文本框之前没有新的ip。如果我在文本框中添加了“重复” 我所做的是创建一个字符串列表。应用程序正在将每个C# 为什么我的阵列';当我将第一项移到末尾时,s的顺序正在更改,c#,C#,我已经做了一个应用程序,它正在存储有关ip的数据。假设我的ip每1分钟改变一次。如果我在添加到文本框之前没有新的ip。如果我在文本框中添加了“重复” 我所做的是创建一个字符串列表。应用程序正在将每个新的\u ip变量添加到列表中。如果它是独一无二的,就保留它。如果不是,则删除列表的第一个值,并将“复制”添加到文本框 我不知道为什么我的订单在变。代码是: private void timer1_Tick(object sender, EventArgs e) { try {
新的\u ip
变量添加到列表中。如果它是独一无二的,就保留它。如果不是,则删除列表的第一个值
,并将“复制”
添加到文本框
我不知道为什么我的订单在变。代码是:
private void timer1_Tick(object sender, EventArgs e)
{
try
{
new_ip = new System.Net.WebClient().DownloadString("https://api.ipify.org");
}
catch
{
}
if (old_ip != new_ip)
{
ipList.Add(new_ip);
if (ipList.GroupBy(n => n).Any(c => c.Count() > 1))
{
ipList.Remove(ipList.First());
ipList.Add("duplicate " + ile.ToString());
ile++;
}
foreach (var name in ipList)
{
textBox1.Text += name + "\r\n";
}
textBox1.Text += "+---------------------+\r\n";
}
old_ip = new_ip;
}
下面是一个简短的例子。ip的正确顺序应为:
11.111.111.111
duplicate 1
22.222.222.222
duplicate 2
33.333.333.333
44.444.444.444
但不幸的是,应用程序给了我这个:
11.111.111.111
+---------------------+
11.111.111.111
22.222.222.222
+---------------------+
22.222.222.222 <--- what the hell happened there?
11.111.111.111 <--- that should be 1 row upper
duplicate 1
+---------------------+
11.111.111.111 <-- Hmm.. it seems to be fine somehow..
duplicate 1
22.222.222.222
duplicate 2
+---------------------+
11.111.111.111
duplicate 1
22.222.222.222
duplicate 2
33.333.333.333
+---------------------+
11.111.111.111
duplicate 1
22.222.222.222
duplicate 2
33.333.333.333
44.444.444.444
+---------------------+
11.111.111.111
+---------------------+
11.111.111.111
22.222.222.222
+---------------------+
22.222.222.222您正在删除第一个项目,而您需要删除列表中第一个出现的项目:
var index = ipList.IndexOf(new_ip);
if(index >= 0)
ipList.RemoveAt(index);
此外,要检查列表中是否存在新ip,您不需要分组方式,只需使用or方法即可。只需执行以下操作
Dictionary<string, int> ipList = new Dictionary<string, int>();
if (!ipList.ContainsKey(new_ip))
{
// new ip that exists once.
ipList.Add(new_ip, 0);
}
else
{
// dupliate ip - increment number of times duplicated
ipList[new_ip] += 1;
}
foreach (KeyValuePair<string,int> value in ipList)
{
textBox1.Text += string.Format(@"IP:{0} Duplicated: {1}\r\n", value.Key, value.Value);
}
Dictionary ipList=newdictionary();
如果(!ipList.ContainsKey(新ip))
{
//一次存在的新ip。
ipList.Add(新的ip,0);
}
其他的
{
//复制ip-复制的增量次数
ipList[new_ip]+=1;
}
foreach(ipList中的KeyValuePair值)
{
textBox1.Text+=string.Format(@“IP:{0}重复:{1}\r\n”,value.Key,value.value);
}
您正在从列表中删除第一项,然后再次添加它。。。您是否尝试单步执行代码?您没有删除重复值的第一个实例,您只是从列表中删除了第一个项目,而不管它是什么。您的GroupBy检测到重复项,但您没有从列表中删除重复项。您可以从列表中删除第一项,无论它是否重复。尝试类似于var dupes=ipList.GroupBy(n=>n).Where(c=>c.Count()>1)代码>。实际上,您希望创建一个新的非重复列表,然后将每个重复列表附加到新列表中,并在每个列表前面加上“duplicate:”,然后用新列表替换旧列表。这样想要容易得多。你在分组,但你从不排序,所以你的顺序永远不会保证是这样。但是添加到列表中的最新项目不是该列表中的第一个?我认为这是清单o_oI添加代码的主要思想,但它仍然在逆转。我将尝试使用Contains
以下是您应该实现的算法:1)检查是否存在新项。2) 如果存在,请删除第一个引用。3) 将新项目添加到列表中。@audiophonic这篇文章似乎回答了您的问题。如果你对答案有疑问或者觉得有帮助,请告诉我:)哦,对不起,我忘了那个帖子。我现在正在想别的事情。当然你帮了我很多,我现在接受你的回答:)谢谢你的反馈,不客气。我也投你一票:)不巧的是,它没有正确地计算重复项。无论以前是否存在新ip,每次都显示0
。更重要的是,我不得不删除@
,因为\r\n
没有新行。现在应该正确地增加重复项ipList[new\u ip]+=1