Vérifier si un objet existe déjà dans la collection
Je suis à l'apprentissage de la programmation et mon problème est que j'ai un tas d'objets et je veux ajouter ces objets à une liste que si la liste ne contient pas déjà l'objet. Deuxièmement, si l'objet est déjà contenue je veux ignorer que l'objet et ajouter le suivant à la place. Je pense que j'ai la première partie de travail juste besoin d'un peu d'aide avec la deuxième partie. Merci beaucoup.
PartyGroup partyGroup = new PartyGroup();
using (AseDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
if (!myPartyGroupList.Contains(partyGroup))
{
partyGroup.PartyGroupID = Convert.ToInt32(reader["party_group_id"]);
partyGroup.PartyGroupName = reader["party_group_name"].ToString();
partyGroup.PersonList = myPersonList;
myPartyGroupList.Add(partyGroup);
}
else
{
//??
}
}
}
OriginalL'auteur Ben | 2010-12-17
Vous devez vous connecter pour publier un commentaire.
Lors de la comparaison, il est préférable d'utiliser la comparaison par rapport à un identificateur, qui dans votre cas est le PartyGroupId. Si vous utilisez contient alors la valeur par défaut de surcharge de contains (), alors la valeur de hachage de l'objet de la liste est utilisé pour la comparaison.
Donc, plutôt que de laisser la comparaison .NET, vous pouvez créer un IEqualityComparer mise en œuvre ou l'utilisation de Linq clause where comme suit.
Une autre suggestion est de renommer PartyGroup membres de la classe:
si (myPartyGroupList.Où(partyGroup => partyGroup.PartyGroupID == groupId).() == False) peut être interprété comme: Part1: SÉLECTIONNEZ partyGroup DE partyGroupList OÙ partyGroup.PartyGroupID = groupID; Part2: il y a des résultats dans la requête précédente? - Le résultat final est une valeur booléenne (true/false). Le résultat est vrai si il y a des lignes de résultat trouvé, sinon le résultat est faux. Pour plus de renseignements, consultez le MSDN ressources sur les extensions LINQ.
Je vois, ça a du sens. Donc pour le moment je suis en obtenant le même PersonList pour chaque PartyGroup. Est-il un moyen de dire que de me donner la PersonList où la partyGroupId correspond à l'id de groupe dans mon PartyGroup objet. Un sens?
Le PartyGroup objet (newPartyGroup) est créé uniquement si un match pour le groupID est trouvé. Cet objet nouvellement créé de PersonList propriété est affectée une valeur de myPersonList.
Merci c'est ce que je pensais. C'est pourquoi je suis un peu mythed que je reçois le même groupe de personnes (PersonList) pour chaque PartyGroup.
OriginalL'auteur Devendra D. Chavan
Vous avez la première partie parfaite.
Il suffit de retirer le 'else' clause et votre routine va automatiquement ajouter l'élément suivant dans la prochaine itération. Comme ceci:
Ne pas le partyGroup obtenir les nouvelles valeurs attribuées avant de vérifier s'il existe dans la liste? Ne pas Ajouter ce code à la première, puis ajoutez pas d'un autre, car il pense qu'il existe déjà puisque les valeurs ne sont pas mis à jour?
Ah merci les gars qui a du sens. Cependant, je suis seulement obtenir le premier élément donc je soupçonne qu'il ya quelque chose de mal avec mon SQL. Merci
Oui Tester101 je crois que c'est ce qui se passe
La première partyGroup ligne devrait dire: partyGroup = new partyGroup();
OriginalL'auteur Flipster
Votre code a certaines questions. Tout d'abord, vous réutilisez le même objet pour chacun de vos itérations.
Envisager
Vous remarquerez que votre liste va avoir 2 articles, mais ils font référence au même objet. Si vous itérer sur la liste et cochez
Bar
, chacun sera de retour"Beta"
.Vous souhaitez créer un nouveau
Foo
pour chaque élément.Dans la boucle termes, que, fondamentalement signifie simplement créer l'objet à l'intérieur de la boucle au lieu de l'extérieur.
Concernant la vérification pour voir si la collection contient déjà l'objet, avez-vous correctement remplacé
Equals
etGetHashCode
? Lorsque vous traitez les classes, le comportement par défaut est tout simplement de vérifier si l'objet de références sont égaux. Si vous êtes préoccupé par la valeurs les objets sont de l'encapsulation, alors vous devez fournir la logique pour vous-même. Dans votre classe, vous devez remplacer laEquals
etGetHashCode
méthodes à mettre en œuvre de votre choix de la méthode de détermination de l'égalité.Maintenant, quand
Contains
cherche à déterminer si l'objet est déjà dans la liste, il sera basé sur les valeurs contenues dans l'objet plutôt que de la mémoire de référence.OriginalL'auteur Anthony Pegram
Vous pouvez envisager d'utiliser un
Hashset<PartyGroup>
à remplir, puis de le convertir en une liste. Si vous avez un grand nombre d'éléments, qui va être beaucoup plus rapide que la vérification de la liste pour chaque élément.Si votre
PartyGroup
classe n'implémente pasIEquatable<PartyGroup>
, vous aurez à fournir un comparateur d'égalité. La suivante devrait fonctionner:Et puis votre initialisation devient:
Une alternative à la
HashSet
, comme quelqu'un l'a souligné, est laDictionary
. Cela vous évite d'avoir à faire le comparateur d'égalité. Vous aurez encore à se convertir à une liste lorsque vous avez terminé. Mais c'est assez facile:OriginalL'auteur Jim Mischel
Essayer cette
OriginalL'auteur Tester101
D'abord, vous vérifiez si l'instance de l'objet est dans la collection, mais vous êtes seulement à la création d'une instance une fois (en dehors de la boucle while). Par conséquent, lorsque vous vérifiez si
!myPartyGroupList.Contains(partyGroup)
, il retournera false la première fois, ce qui vous permettra d'ajouter le fichier à la collecte puis elle retourne la valeur false à chaque fois.Je voudrais utiliser un Dictionnaire à l'aide d'une propriété Id comme clé de Dictionnaire.
comme ceci:
OriginalL'auteur Gerardo Grignoli