-2
votes

C # Comment sélectionner des éléments distincts d'objets à l'aide de LINQ

Je voudrais sélectionner uniquement les noms d'utilisateur distincts et ID de la requête. Actuellement, il renvoie des doublons. XXX PRE>

J'ai essayé de faire Nom = grp.key.user.first (). Tostring () Code> Mais cela me donne la première lettre du nom d'utilisateur. p>

Exemple de sortie actuel: P> xxx pré>

sortie souhaitée: p>

 {UserID=1,UserName="N1"}
 {UserID=2,UserName="N2"}


2 commentaires

mis à jour le commentaire.


Salut @ hj1990, jetez un coup d'œil à la deuxième partie de ma réponse, c'est exactement ce que vous voulez. Le problème est que les objets dynamiques n'ont aucune définition des égaux, de sorte que le groupe par ne fonctionne pas: sinon est défini, ils sont tous différents.


3 Réponses :


1
votes

supposons que votre clé (pour les utilisateurs) est ID et que vous avez ce jeu de données: xxx pré>

que, lorsque vous voulez des couples distincts de (userid, nom d'utilisateur), vous aurez le nom d'utilisateur UN1 deux fois, une fois pour ID 1 et une fois pour ID 3. Le seul moyen de faire le tour est d'ignorer l'ID utilisateur. Cela signifie que vous devez modifier le code de cette manière: p> xxx pré>

droite réponse - éditer après des exemples donnés strong> p>

si Ce n'était pas le cas et votre problème est que votre requête renvoie deux fois le couple (1, UN1) à partir du jeu de données suivant: P>

public class UserData{
     public string UserName {get;set;}
     public string UserId {get;set;}

     public override bool Equals(object x) {
        if (! (x is UserData)) return false;
        UserData y = (UserData) x;
        return this.UserName == x.UserName && this.UserId == x.UserId;
     }
}

TotalUsers = (from p in reports
                               group p by new UserData
                               {
                                   UserId = p.UserId,
                                   UserName = p.UserName
                               } into grp
                               select new Employee()
                               {
                                   Name = grp.Key.UserName,
                                   Id = grp.Key.UserId
                               }).ToList();


0 commentaires

1
votes

Je crée un groupe et sa clé contient $ "{p.userid} - {p.username}" et il assurera son unique xxx


3 commentaires

Obtenez-le de la clé ou du premier élément, c'est la même chose non?


groupe par clé et obtenir le premier élément de ce groupe.


Désolé, la clé ici est une chaîne, mais pour le code posté dans la question, obtenez le nom d'utilisateur à partir de la touche ou de l'élément IRST, c'est la même chose.



2
votes

Ceci est vraiment difficile à répondre sans savoir ce que votre rapporte Les objets ressemblent et ayant un Exemple reproductible minimal .

Je fais de l'hypothèse que userid est un identifiant unique pour l'utilisateur. Et que le nom d'utilisateur correspondra toujours avec le userid . Si tel est le cas, les utilisateurs distincts devraient vous donner les utilisateurs distincts ... xxx

Le groupby rassemblera tous les éléments avec le même Userid . Ensuite, nous sélectionnons le premier de ces objets - c'est entièrement arbitraire et sans savoir pourquoi vous obtenez des duplicats, cela peut ne pas être la meilleure solution - Cela vaut peut-être la peine d'être examinée pourquoi vous obtenez des duplicats, plutôt que de résoudre le problème ici . Ensuite, chacun d'entre eux est converti en un objet .


0 commentaires