IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linq Discussion :

Rechercher les n valeurs les plus proches d'une valeur référence


Sujet :

Linq

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 42
    Points
    42
    Par défaut Rechercher les n valeurs les plus proches d'une valeur référence
    bonjour

    voici mon soucis.
    J'ai un fichier texte avec des données qui se présentent comme l'image ci dessous
    Nom : Nouvelle image.jpg
Affichages : 711
Taille : 53,6 Ko

    actuellement, j'ai fait une table avec toutes ces colonnes, ça me permet d'avoir différent format dans le meme objet.
    Ma valeur de référence, c'est la dernière valeur de la colonne "Grav" (4896.351).
    Je cherche, a extraire les 3 lignes dont les valeurs "Grav" sont les plus prochent de 4896.351

    Est ce qu'il existe un moyen avec Linq de faire ça facilement ?
    a la base j'ai une fichier texte, s'il faut passer par autre chose qu'une table pour cette étape, c'est aussi envisageable.

    merci d'avance.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Tu peux trier la colonne Grav puis récupérer les 3 premières valeurs (si tri DESC). Un truc du genre :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    var result = taTable.OrderByDescending(x => x.Grav).Skip(0).Take(3);
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    j'y connais rien en linq, mais si je fais un tri par ordre décroissant, je vais avoir les 4 valeurs les plus petites :
    4896.337
    4896.342
    4896.343
    4896.344
    mais je veux les 3 valeurs les plus proches de 4896.351
    ici :
    4896.351 (ref)
    4896.350
    4896.350
    4896.352

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 57
    Points : 42
    Points
    42
    Par défaut
    je pense avoir trouvé la solution.
    Je suis parti de cette ligne de code, que je ne comprend pas du tout (trouvé sur le net) mais que j'utilisais déjà sur une liste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    closest = Maliste.Aggregate((x, y) => Math.Abs(x - ref) < Math.Abs(y - ref) ? x : y);
    j'ai essayé de l'adapté a une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var closest = Matable.AsEnumerable().Aggregate((r, t) => Math.Abs(r.Field<double>("ColonneID") - ref) < Math.Abs(t.Field<double>("ColonneID") - ref) ? r : t);
    ça me donne un DataRow, du coup je cherche l'index (ensuite j'en profite pour la mettre de coté dans une autre table par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var index = Matable.Rows.IndexOf(closest);
    je supprime cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matable.Rows.RemoveAt(index);
    et recommence l'opération N fois

    il y a peut etre plus simple mais déja ça a le mérite de fonctionner ^^

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par ewaca Voir le message
    je pense avoir trouvé la solution.

    il y a peut etre plus simple mais déja ça a le mérite de fonctionner ^^
    Inspiré de ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var result = maTable.OrderBy(x => Math.Abs(valReference - x.Grav)).Take(3).ToList();
    Linq est un super outil une fois maîtrisé. (pas bête l'utilisation des absolus)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/01/2015, 16h52
  2. Trouver la valeur la plus proche dans une ligne
    Par tavita987 dans le forum Excel
    Réponses: 5
    Dernier message: 05/02/2014, 11h12
  3. Réponses: 5
    Dernier message: 02/01/2014, 10h26
  4. [MySQL] PHP / MySQL - valeur la plus proche d'une coordonnée GPS
    Par josse34 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/10/2013, 21h32
  5. trouver valeur la plus proche dans une colonne
    Par niepoc dans le forum Général Python
    Réponses: 10
    Dernier message: 05/06/2009, 15h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo