2016-06-17 16 views
0

Ich habe 2 Riesen-Listen (über 2000 jeweils)C# Parse & vergleichen riesige Liste/string

Und ich will & vergleichen sie analysieren.

Was die Liste wie folgt aussieht:

zone "exampledomain.com" { 
zone "exampledomain2.com" { 
zone "exampledomain3.com" { 
zone "exampledomain4.com" { 
zone "exampledomain5.com" { 
zone "exampledomain6.com" { 
zone "exampledomain7.com" { 

Was die andere Liste wie folgt aussieht:

zone "exampledomain.com" { 
zone "exampledomain3.com" { 
zone "exampledomain5.com" { 
zone "exampledomain7.com" { 

Beide Listen das gleiche Format der Zone haben "____" { Ich möchte so analysieren, dass Ich kann die Domains vergleichen und dann die Domains unterscheiden, damit ich weiß, was dem anderen fehlt, sie sollten beide die gleichen Ergebnisse haben.

Ich habe über diesen Code kommen:

static void Main(string[] args) 
{ 
    string s1 = "i have a car a car"; 
    string s2 = "i have a new car bmw"; 

    List<string> diff; 
    IEnumerable<string> set1 = s1.Split(' ').Distinct(); 
    IEnumerable<string> set2 = s2.Split(' ').Distinct(); 

    if (set2.Count() > set1.Count()) 
    { 
     diff = set2.Except(set1).ToList(); 
    } 
    else 
    { 
     diff = set1.Except(set2).ToList(); 
    } 
} 

Aber ich frage mich, was der beste Weg, es zu tun wäre, ich habe mehr als 2000 Zeilen in jeder Liste unter Berücksichtigung.

Antwort

0

Das Beispiel Sie nur Liste 1 mit den Einzelteilen aus der Liste zeigen 2 entfernt. Wenn Sie auch wollen, was in der Liste 2, die nicht in der Liste ist 1 Sie müssen zwei Abfragen tun

var difference1 = list1.Except(list2); 
var difference2 = list2.Except(list1); 

Ich bin mir nicht sicher, welcher Code beteiligt ist, wenn Ausnahme ausgeführt wird, aber wenn Sie möchten eine Implementierung zu sehen, wie zwei Listen Unterschiede zu erzeugen, enthält dann ist hier eine Lösung:

static void Differerence(
    IEnumerable<string> source1, IEnumerable<string> source2, 
    out List<string> difference1, out List<string> difference2) 
{ 
    //Move the data from the sources into ordered queues 
    var sourceValues1 = new Queue<string>(source1.OrderBy(x => x)); 
    var sourceValues2 = new Queue<string>(source2.OrderBy(x => x)); 

    difference1 = new List<string>(); 
    difference2 = new List<string>(); 

    while(sourceValues1.Count > 0 && sourceValues2.Count > 0) 
    { 
     string value1 = sourceValues1.Peek(); 
     string value2 = sourceValues2.Peek(); 
     switch (string.Compare(value1, value2)) 
     { 
      //If they match then don't add difference to either list 
      case 0: 
       sourceValues1.Dequeue(); 
       sourceValues2.Dequeue(); 
       break; 

      //The left queue has the lowest value, record that and move on 
      case -1: 
       difference1.Add(value1); 
       sourceValues1.Dequeue(); 
       break; 

      //The right queue has the lowest value, record that and move on 
      case 1: 
       difference2.Add(value2); 
       sourceValues2.Dequeue(); 
       break; 

     } 
    } 
    //At least one of the queues is empty, so everything left in the other queue 
    difference1.AddRange(sourceValues1); 
    difference2.AddRange(sourceValues2); 
} 

ich weiß nicht, wie LINQ möglicherweise schneller jeder tun könnte, aber meine Routine mit Dubletten Einträge wie der Wert befassen "1" im folgenden Beispiel, während LINQ nicht. Behalten Sie das im Hinterkopf, wenn Sie sich entscheiden, welches Sie verwenden möchten und nicht nur den Geschwindigkeitsunterschied.

static void Main(string[] args) 
{ 
    var list1 = new string[] { "1", "1", "3", "5", "7", "9" }; 
    var list2 = new string[] { "1", "2", "4", "6", "9", "10" }; 

    var difference1 = list1.Except(list2); 
    var difference2 = list2.Except(list1); 

    List<string> differenceX1; 
    List<string> differenceX2; 

    Differerence(list1, list2, out differenceX1, out differenceX2); 
} 

Es ist einfach, die beiden Ergebnisse zu einem kombinieren, wenn Sie

benötigen
var allDifferences = differenceX1.Union(differenceX2);