2016-07-27 10 views
-1

Ich habe eine App gemacht, die Daten über IP speichert. Nehmen wir an, meine IP ändert sich alle 1 Minute. Wenn ich nicht neue IP hatte, fügen Sie es der Textbox hinzu. Wenn ich - hatte "Duplicate" in Textfeld hinzufügen.Warum ändert sich die Reihenfolge meines Arrays, wenn ich das erste Element an das Ende verschiebe

Was ich getan habe, ist eine Liste von Zeichenfolgen erstellt. Die App fügt jede new_ip Variable zu List hinzu. Wenn es einzigartig ist, behalte es. Wenn nicht, löschen Sie zuerst den Wert List und fügen Sie "Duplicate" zu textBox hinzu.

Ich weiß nicht, warum sich meine Bestellung ändert. Der Code ist:

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

Hier ist ein kurzes Beispiel. Richtige Reihenfolge von ip sollte sein:

11.111.111.111 
duplicate 1 
22.222.222.222 
duplicate 2 
33.333.333.333 
44.444.444.444 

Aber unfortunelly die App gaben mir dies:

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

hat jemand eine Idee, wo ist der Fauxpas?

+0

Sie das erste Element aus der Liste zu entfernen und es dann erneut Hinzufügen ... haben Sie versucht, durch den Code treten? – pquest

+0

Sie löschen nicht die erste Instanz des doppelten Werts, Sie löschen nur das erste Element aus der Liste, unabhängig davon, was es ist. – itsme86

+0

Ihre GroupBy erkennt Duplikate, aber Sie entfernen die Duplikate nicht aus der Liste. Sie entfernen das erste Element aus der Liste, ob das ein Duplikat ist oder nicht. Versuchen Sie etwas wie 'var dupes = ipList.GroupBy (n => n). Wo (c => c.Count()> 1);'. Wirklich, Sie möchten eine neue Liste von Nicht-Duplikaten erstellen, dann jedes Duplikat an die neue Liste mit "Duplicate:" anfügen, die jedem vorangestellt sind, und die alte Liste durch die neue ersetzen. Viel einfacher, so zu denken. –

Antwort

3

Sie sind erstes Element zu entfernen, während Sie die erste Vorkommen des Elements in der Liste entfernen müssen:

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

auch zu überprüfen, ob die neue IP in der Liste vorhanden ist, brauchen Sie nicht eine Gruppe Sie können einfach eine IndexOf oder Contains Methode verwenden.

+0

Ich habe Ihren Code hinzugefügt, aber er kehrt immer noch um. Ich versuche es mit 'Contains'. – audiophonic

+0

Hier ist der Algorithmus, den Sie implementieren sollten: * 1) * Überprüfen Sie, ob ein neues Element vorhanden ist. * 2) * Falls vorhanden, entfernen Sie das erste Vorkommen. * 3) * Hinzufügen eines neuen Elements zur Liste. –

+0

@audiophonic Es scheint, der Beitrag beantwortet Ihre Frage. Lassen Sie mich wissen, wenn Sie Fragen zur Antwort haben oder wenn Sie es hilfreich finden :) –

0

nur etwas tun, wie

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

Unfirunellely zählt Duplikate nicht richtig. Es zeigt "0" jedes Mal an, egal, ob eine neue IP vorher existierte oder nicht. Außerdem musste ich '@' löschen, weil '\ r \ n' keine neue Zeile erzeugt. – audiophonic

+0

Es sollte Duplikate nun korrekt ipList [new_ip] + = 1 inkrementieren – jjf1978

Verwandte Themen