2009-03-31 22 views
1

Ich habe ein Array von Arrays - Informationen über die Auswahl in Excel mit VSTO, wobei jedes Element bedeutet Start und Ende Auswahlposition.So entfernen Sie Duplikate aus int [] []

Zum Beispiel

int[][] selection = { 
new int[] { 1 }, // column A 
new int[] { 6 }, // column F 
new int[] { 6 }, // column F 
new int[] { 8, 9 } // columns H:I 
new int[] { 8, 9 } // columns H:I 
new int[] { 12, 15 } // columns L:O 
}; 

Könnten Sie mir bitte helfen, einen Weg zu finden, vielleicht LINQ oder Erweiterungsmethoden verwenden, duplizierte Elemente zu entfernen? Ich meine: F und F, H:I und H:I usw.

+1

Definieren Sie den besten Weg: a) schnellste, b) einfachste Code zu lesen, c) verwendet die geringste Menge an Speicher, etc. –

+0

Doppelte Zeilen? Was genau bestimmt, ob eine Zeile gleich ist oder nicht - muss es genau die gleiche Sequenz sein? –

+0

Danke für Ihre Korrektur, ich habe meinen Beitrag bearbeitet – abatishchev

Antwort

3

Wenn Sie eine reine LINQ/Extension-Methode Lösung verwenden wollen, dann werden Sie benötigen, um Ihre eigene Implementierung von IEqualityComparer für Arrays/Sequenzen zu definieren. (Sofern ich nicht etwas Offensichtliches verpasse, gibt es in der BCL keinen bereits existierenden Array- oder Sequenzvergleicher). Dies ist jedoch nicht sehr hart - hier ist ein Beispiel für eine, die ziemlich gut die Arbeit machen sollte:

public class SequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>> 
{ 
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y) 
    { 
     return Enumerable.SequenceEqual(x, y); 
    } 

    // Probably not the best hash function for an ordered list, but it should do the job in most cases. 
    public int GetHashCode(IEnumerable<T> obj) 
    { 
     int hash = 0; 
     int i = 0; 
     foreach (var element in obj) 
      hash = unchecked((hash * 37 + hash) + (element.GetHashCode() << (i++ % 16))); 
     return hash; 
    } 
} 

Der Vorteil hierbei ist, dass man dann die rufen Sie einfach alle doppelten Arrays entfernen folgen.

var result = selection.Distinct(new SequenceEqualityComparer<int>()).ToArray(); 

Hoffe, dass hilft.

0

Zuerst müssen Sie die Ganzzahl-Arrays vergleichen. Um es mit den Klassen im Framework zu verwenden, machen Sie das mit EquailtyComparer. Wenn die Arrays immer sortiert wird, ist, dass ziemlich einfach zu implementieren:

public class IntArrayComparer : IEqualityComparer<int[]> { 

    public bool Equals(int[] x, int[] y) { 
     if (x.Length != y.Length) return false; 
     for (int i = 0; i < x.Length; i++) { 
      if (x[i] != y[i]) return false; 
     } 
     return true; 
    } 

    public int GetHashCode(int[] obj) { 
     int code = 0; 
     foreach (int value in obj) code ^= value; 
     return code; 
    } 

} 

Jetzt können Sie einen Integer-Array als Schlüssel in einem HashSet verwenden, um die einzigartige Arrays zu erhalten:

int[][] selection = { 
    new int[] { 1 }, // column A 
    new int[] { 6 }, // column F 
    new int[] { 6 }, // column F 
    new int[] { 8, 9 }, // columns H:I 
    new int[] { 8, 9 }, // columns H:I 
    new int[] { 12, 15 } // columns L:O 
}; 

HashSet<int[]> arrays = new HashSet<int[]>(new IntArrayComparer()); 
foreach (int[] array in selection) { 
    arrays.Add(array); 
} 

Die HashSet nur werfen weg doppelte Werte, so dass es jetzt vier Ganzzahl-Arrays enthält.

Verwandte Themen