Sto provando a fare un Gruppo Linq su alcuni oggetti utilizzando un tipo di chiave esplicito. Non sto passando un IEqualityComparer
al GroupBy, quindi in base ai documenti: l'uguaglianza di confrontoConfronto chiave per Linq GroupBy utilizzando EqualityComparer predefinito
L'impostazione predefinita
Default
viene utilizzato per confrontare le chiavi.
E spiega la proprietà EqualityComparer<T>.Default
in questo modo:
I
Default
controlli di proprietà se tipoT
implementa l'interfaccia genericaSystem.IEquatable<T>
e in tal caso restituisce unEqualityComparer<T>
che utilizza tale implementazione.
Nel seguente codice, sto raggruppando un array di oggetti Fred
. Hanno un tipo di chiave chiamato FredKey
, che implementa IEquatable<FredKey>
.
Questo dovrebbe essere sufficiente per far funzionare il raggruppamento, ma il raggruppamento non funziona. Nell'ultima riga qui sotto dovrei avere 2 gruppi, ma io no, ho solo 3 gruppi contenenti i 3 elementi di input.
Perché è il raggruppamento non funziona?
class Fred
{
public string A;
public string B;
public FredKey Key
{
get { return new FredKey() { A = this.A }; }
}
}
class FredKey : IEquatable<FredKey>
{
public string A;
public bool Equals(FredKey other)
{
return A == other.A;
}
}
class Program
{
static void Main(string[] args)
{
var f = new Fred[]
{
new Fred {A = "hello", B = "frog"},
new Fred {A = "jim", B = "jog"},
new Fred {A = "hello", B = "bog"},
};
var groups = f.GroupBy(x => x.Key);
Debug.Assert(groups.Count() == 2); // <--- fails
}
}
È stato. Grazie. Ho trovato una buona spiegazione qui: http://www.codeproject.com/KB/dotnet/IEquatable.aspx –
Questo significa che dovresti avere * due * Uguali metodi in 'FredKey': uno per' Equals (Object) ' e uno per 'Equals (FredKey)'? – bonh