C# 为什么我的阵列';当我将第一项移到末尾时,s的顺序正在更改

C# 为什么我的阵列';当我将第一项移到末尾时,s的顺序正在更改,c#,C#,我已经做了一个应用程序,它正在存储有关ip的数据。假设我的ip每1分钟改变一次。如果我在添加到文本框之前没有新的ip。如果我在文本框中添加了“重复” 我所做的是创建一个字符串列表。应用程序正在将每个新的\u ip变量添加到列表中。如果它是独一无二的,就保留它。如果不是,则删除列表的第一个值,并将“复制”添加到文本框 我不知道为什么我的订单在变。代码是: private void timer1_Tick(object sender, EventArgs e) { try {

我已经做了一个应用程序,它正在存储有关ip的数据。假设我的ip每1分钟改变一次。如果我在添加到文本框之前没有新的ip。如果我在文本框中添加了“重复”

我所做的是创建一个字符串列表。应用程序正在将每个
新的\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