IEqualityComparer et contient la méthode
J'ai cette classe simple avec ces 2 champs de type enum, j'essaie de trouver un élément de cet objet dans une collection ( List<T>
), mais Contient des méthodes ne fonctionne pas correctement
public class Calculator : IEqualityComparer<Calculator>
{
public DashboardsComputationMode ComputationMode { get; set; }
public Modes Mode { get; set; }
public Calculator(DashboardsComputationMode dashboardsComputationMode, Modes mode)
{
ComputationMode = dashboardsComputationMode;
Mode = mode;
}
public bool Equals(Calculator x, Calculator y)
{
return (x.ComputationMode.Equals(y.ComputationMode) && x.Mode.Equals(y.Mode));
}
public int GetHashCode(Calculator obj)
{
return obj.ComputationMode.GetHashCode() ^ obj.Mode.GetHashCode();
}
}
public enum DashboardsComputationMode
{
Weighted = 0,
Aggregated = 1,
PR = 2,
CurrentValue = 3,
EquivalentHours = 4,
AggregatedCorrected = 5,
PRCorrected = 6
}
public enum Modes
{
InstantaneousMode = 0,
DailyMode = 1,
MonthlyMode = 2,
YearlyMode = 5,
Undefined = 4,
}
Pourquoi ne pouvait-être que ce test ne fonctionne pas
[TestMethod]
public void TestMethod1()
{
var list = new List<Calculator>()
{
new Calculator(DashboardsComputationMode.PR, Modes.DailyMode),
new Calculator(DashboardsComputationMode.CurrentValue, Modes.YearlyMode),
new Calculator(DashboardsComputationMode.PRCorrected, Modes.MonthlyMode)
};
var item = new Calculator(DashboardsComputationMode.CurrentValue, Modes.YearlyMode);
Assert.IsTrue(list[1].Equals(item));
Assert.IsTrue(list.Contains(item));
}
La première affirmer fonctionne très bien
Assert.IsTrue(list[1].Equals(item))
mais le deuxième n'a pas
Assert.IsTrue(list.Contains(item));
source d'informationauteur Pablo Rodríguez
Vous devez vous connecter pour publier un commentaire.
List<T>.Contient
détermine l'égalité en utilisant le comparateur d'égalité par défaut (celui retourné par laEqualityComparer<T>.Default
).Voici la MSDN explication sur la façon dont
EqualityComparer<T>.Default
travaux:En d'autres termes, votre
Calculator
classe doit soit mettre en œuvre la Système.IEquatable (pas laSystem.IEqualityComparer
!) interface ou de remplacer le Objet.Est égal à et Objet.GetHashCode méthodes.Vous n'êtes pas à l'aide de
IEqualityComparer<Calculator>
dans d'égal à Égal et Contient à la fois.EqualityComparer
a une signification différente. J'ai corrigé le code pour vous.Maintenant deux doit retourner true.