J'ai écrit une classe d'objets de compte et contient une liste Mon problème est que je dois être en mesure de réinsérer le compte dans la liste après la fin de mon programme de travailler avec elle, avec des informations mises à jour ajoutées. Puis-je faire cela comme écrit ci-dessous, à l'aide de la fonction Indexof () pour vérifier l'objet dans la liste statique ou échouera-t-il parce que je l'ai ajouté de données? Je ne comprends pas quels domaines il compare pour voir si les deux objets sont les mêmes. P> Remarque: aucun doublure n'est autorisé dans la liste, il n'ya donc aucun risque de mettre à jour le mauvais article p> statique
5 Réponses :
Votre objet doit implémenter le Iequatable interface et remplacer le Égale code> méthode.
public class Account : IEquatable<Account>
{
public string name;
public string password;
public string newInfo;
public bool Equals(Account other)
{
//Choose what you want to consider as "equal" between Account objects
//for example, assuming newInfo is what you want to consider a match
//(regardless of case)
if (other == null)
return false;
return String.Equals(this.newInfo, other.newInfo,
StringComparison.OrdinalIgnoreCase);
}
}
En réalité, l'interface appropriée est Iequatable
Equals code> et est utilisée par
indexof code> dans les collections génériques.
IéqualityComparer
t code>.
J'apprécie vraiment l'exemple. Je suis toujours nouveau et j'apprendrais cela comme un passe-temps, donc une explication technique est beaucoup plus difficile à visualiser que le code.
Vous devez également remplacer gethascode () code> voir la section Notes sur les implémentations b> section de la page pour
IEQUABLE
Iequatable
objet.equals (objet) code> et
gethascode code> afin que leur comportement soit cohérent avec celle de la méthode code>
@Blizz - Scott a ajouté des informations supplémentaires dans sa réponse importante (non requise pour l'index de l'index de l'index mais devrait être mise en œuvre indépendamment). Vous pouvez surmonter le mien comme réponse et accepter son.
Vous n'avez même pas besoin de le faire implémenter Iequatable
égaux (objet) code> et
gethashcode code> le fera. De plus, il y a des dangers pour mettre en œuvre
iéquatif code> sur une classe non scellée. Voir blog.mischel.com/2013/ 01/05 / ...
@Jimmischel - Je n'avais pas rencontré cela auparavant, merci pour le lien!
Si votre classe implémente correctement sinon, IEQUABLE
, puis indexofof () code> utilisera votre
Equals () code> méthode pour tester l'égalité. p>
indexofof () code> utilisera l'égalité de référence. P>
Une chose la réponse acceptée n'a pas couvert est que vous êtes censé remplacer égaux (objet) code> et
gethascode () code> pour
iéquatif
+1 - Cela devrait être la réponse acceptée. L'appel code> code> n'utilise pas cela afaik, c'est pourquoi mon code a fonctionné, mais pour une utilisation générale, il n'y a aucune raison de ne pas le faire.
Merci j'ai mis à jour la réponse acceptée au cas où quelqu'un d'autre vient à travers elle
Il semble suffisant de remplacer simplement gethashcode code> et
est égal à code> comme indiqué ci-dessus, sans implémenter
iéquatif
Une autre option consiste à utiliser list.findindex , et passez un prédicat. C'est-à-dire: de cette façon, vous pouvez rechercher sur n'importe quel champ arbitraire ou nombre de champs. Ceci est particulièrement utile si vous n'avez pas accès au code source du compte code> pour ajouter un
surchargé d'égal code> méthode. P> p>
Vous pouvez utiliser un prédicat personnalisé pour votre classe, telle que: alors vous pouvez l'utiliser comme suit: p> Vous pouvez même modifier la classe IndeofName pour utiliser un drapeau pour basculer entre le type d'informations que vous recherchez. Ex: nom ou newinfo. P> p>
J'ai édité votre titre. S'il vous plaît voir, " Les questions incluent" Tags "dans leurs titres? ", où le consensus est "non, ils devraient ne pas".
Avez-vous vérifié le Documentation ? Il est indiqué "Cette méthode détermine l'égalité à l'aide du comparateur d'égalité par défaut Equalitomerer .default pour T, type de valeurs de la liste."
Si vous ne vous souciez pas de la commande une fois que vous avez implémenté soit un
personnalisé
ou avez un support de compte
iéquatie code> Vous pouvez être mieux éteint à l'aide d'un
hashset code> SEANCE Vous n'avez pas de doublons.