为什么我的数组';当我把第一个项目移到最后时,它的顺序发生了变化

本文关键字:最后 变化 发生了 顺序发生 顺序 项目 数组 我的 第一个 为什么 | 更新日期: 2023-09-27 17:59:01

我制作了一个存储ip数据的应用程序。假设我的ip每1分钟更改一次。如果我在把它添加到文本框之前没有新的ip。如果我在文本框中添加了"Duplicate"

我所做的是创建一个字符串列表。该应用程序正在将每个new_ip变量添加到列表中。如果它是唯一的,则保留它。如果不是,则删除List的第一个值,并将"Duplicate"添加到textBox

我不知道为什么我的订单在变。代码为:

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
+---------------------+

有人知道失态在哪里吗?

为什么我的数组';当我把第一个项目移到最后时,它的顺序发生了变化

您正在删除第一个项目,而您需要删除列表中第一个出现的项目:

var index = ipList.IndexOf(new_ip);
if(index >= 0)
   ipList.RemoveAt(index);

此外,为了检查列表中是否存在新ip,您不需要分组依据,只需使用IndexOfContains方法即可。

只需做一些类似的事情

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