当我将第一个项目移动到最后时,为什么我的数组的顺序正在改变

时间:2016-07-27 19:56:35

标签: c#

我做了一个存储ip数据的应用程序。让我们说我的ip每1分钟就会改变一次。如果在将新文件添加到文本框之前我没有新的IP。如果我 - 已在文本框中添加"Duplicate"

我所做的是创建一个字符串列表。该应用正在将每个new_ip变量添加到List。如果它是独一无二的,请保留它。如果不是,则删除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
+---------------------+

是否有人知道失态在哪里?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

做一些像

这样的事情
        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);
        }