0
votes

C # LINQ Comparaison des valeurs de liste à l'aide de plusieurs champs et d'un élément de retour qui ne satisfait pas la condition

J'ai une liste comme celle-ci appelée résultat xxx

Je dois filtrer la liste basée sur gid, partage, type, OPC, IPC ayant les mêmes valeurs et Prix ​​ayant une valeur différente. Donc, de la liste des seconde et du dernier ayant un prix différent, j'ai besoin d'obtenir cette liste de liste ou d'identité à partir de l'élément de liste qui ont un prix différent et de repos des valeurs identiques.

en utilisant deux Des boucles que j'ai pu obtenir ce dont j'avais besoin, mais malheureusement, on m'a demandé de la convertir en une requête LINQ. C'est ce que j'ai essayé xxx

mais de la requête ci-dessus, je ne reçois pas ce que je voulais, je crois que je suis proche de ce dont j'avais besoin mais que je manque de l'expertise avec Linq.


6 commentaires

Pourriez-vous publier votre code précédent avec les boucles?


@Arcord je ne l'ai pas maintenant. Sa boucle de forache imbriquée comme pourcheach (var cétant1 en résultat) {foreach (variètion2 en résultat) {if (item1.gid == item2.gid && ... item1.Prix! = item2.prices) {// Définit l'élément1. ID dans une liste}}}


Si vous avez du code que vous souhaitez converti dans une requête de liaison, alors c'est probablement le code que vous devriez montrer. Soit cela ou décrivez comment le code que vous avez affiché n'est pas fourni les résultats escomptés.


GroupBy est généralement un bon moyen d'obtenir des articles liés par certaines propriétés communes.


La chose est que ce n'est pas tout à fait clair ce que vous voulez accomplir. Comparez-vous contre un ensemble de valeurs d'entrée? Ou voulez-vous dire "toutes les rangées qui ont le même x, Y et Z, renvoient seulement celle qui a un prix différent des autres dans le même groupe".


@ Lassev.karlsen Si vous voyez la liste des résultats autre que le gid de prix est unique pour un ensemble de données. La différence de prix est donc cochée contre chaque ensemble groupé par GID. La liste avec GID 27720 et 27721 peut être considérée comme deux ensemble de données différents.


3 Réponses :


0
votes

Donc, j'ai besoin d'obtenir cette liste ou une propriété d'identification à partir de l'élément de la liste qui dispose de prix différent et de repos des valeurs identiques

Vous pouvez regrouper des propriétés contenant des tuple de valeur qui doivent être égales, puis sélectionner des groupes avec plus d'un élément: xxx


3 commentaires

Je pense que cette requête, retourne deux éléments avec un gid différent et un même prix.


Vous avez un autre problème g a un conflit avec la dernière ligne :)


@Sajid en fait, il fonctionne dans ma machine, mais fixe pour la clarté



1
votes

Vous pouvez utiliser groupe par pour grouper toutes les propriétés sauf ID , comme le code suivant: xxx

Démo xxx

résultat xxx

J'espère que vous trouverez cette utile.


7 commentaires

Dans ce cas, il souhaiterait avoir seulement celui dont le prix diffère. Vous pouvez supprimer les groupes avec plus d'un élément et ce sera ok :-)


@Arcord, j'ai déjà mis à jour la réponse, j'ai déjà un doute si l'OP veut aussi un élément de lignes dupliquées. Mais après avoir relis la question, j'ai laissé tous les éléments de groupeby et j'utilise où compte == 1 qui ne donne que des lignes non dupliquées. merci. + 1


@Sajid Cela reviendra également à des groupes qui n'ont qu'un seul élément pour {x.gid, x.share, x.type, x.opc, x.ipc}


@Gurustron, si je comprenais correctement, par cette requête, si je supprime le prix de groupyby , où (x => x.count () == 1) donne 0 , parce que nous avons 6 + 6 lignes dupliquées sans prix et id.


@Sajid Ajouter {id = "8131367", gid = 27722, Share = 1.0000, type = "1029", OPC = "997", IPC = "997", prix = 500,00} (unique < code> gid ) à l'exemple de OP.


@Gurustron L'OP a dit: Je dois filtrer la liste basée sur GID, partager, Type, OPC, IPC ayant les mêmes valeurs et prix ayant une valeur différente , je pense que pour la ligne mentionnée dans votre commentaire, ne pas avoir les mêmes valeurs, elle est automatiquement une nouvelle lignée sans vérifier le prix.


@Sajid je supposerais que OP n'a pas de cas de telle Edge ou n'en avez pas pensé, mais de la citation - pour la liste de tous les prix sont les mêmes)



1
votes

Ceci fonctionnera mais n'est pas optimisé du tout:

var result2 = result
    .GroupBy(i => new {i.GId, i.Share, i.Type, i.OPC, i.IPC})
    .Select(i1 => i1.LastOrDefault(i2 => i1.Count(i3 => i3.Price == i2.Price) == 1))
    .ToList();


0 commentaires