2010-01-07 10 views

Respuesta

9

Puede usar el Comparer property del diccionario para establecerlo en un comparador personalizado creado por usted.

EDIT: en realidad la propiedad es de solo lectura, lo siento. Definitivamente, usted debe utilizar el constructor adecuado:

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 ret = 0; 
     for (int i = 0; i < obj.Length; ++i) { 
      ret ^= obj[i].GetHashCode(); 
     } 
     return ret; 
    } 
} 
static void Main(string[] args) { 
    Dictionary<int[], bool> dict = new Dictionary<int[], bool>(new IntArrayComparer()); 
} 
3

Hay básicamente dos maneras de hacerlo:

  • Crear un comparador que implementa IEqualityComparable<int[]>, que se pasa al constructor del diccionario.
  • Crea una clase de clave que encapsula la matriz de enteros e implementa IEquatable<T>.
1

No hay nada malo con la respuesta de orsogufo, pero quería señalar que si tiene .NET 3.5, se puede implementar un ArrayValueComparer con mucho menos código, y al mismo tiempo hacer que sea genérico, por lo que puede compare los valores de cualquier tipo de matriz, y no solo las matrices de enteros. Para el caso, podría hacer que funcione fácilmente con cualquier IEnumerable, y no solo con matrices.

using System.Collections.Generic; 
using System.Linq; 

class ArrayValueComparer<T> : IEqualityComparer<T[]> 
{ 
    public bool Equals(T[] x, T[] y) 
    { 
     return x.SequenceEqual(y, EqualityComparer<T>.Default); 
    } 

    public int GetHashCode(T[] obj) 
    { 
     return obj.Aggregate(0, (total, next) => total^next.GetHashCode()); 
    } 
} 

static void Main(string[] args) 
{ 
    var dict = new Dictionary<int[], bool>(new ArrayValueComparer<int>()); 
} 
Cuestiones relacionadas