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

VB.NET Discussion :

BinarySearch, IndexOf pour Array multidimensionnelle


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 27
    Points
    27
    Par défaut BinarySearch, IndexOf pour Array multidimensionnelle
    Bonjour le forum,

    Je n'arrive pas a mettre la main sur l'equivalent des fonctions array.IndexOf ou meme array.Binarysearch pour ce qui est des Array Multidimensionnelles...

    Pouvez-vous me dire si effectivement elles existent?

    Il parait invraisemblable que Microsoft ne les ait pas crees surtout a partir du .net framework 4.0...

    sinon connaissez vous des solutions alternatives viables et rapides?

    Merci Beaucoup

    Anthony

  2. #2
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 493
    Points
    5 493
    Par défaut
    Bonjour, effectivement ces fonctions n'existent pas à ma connaissance. Je ne trouve pas cela scandaleux d'ailleurs : encore, pour IndexOf ça pourrait se discuter (mais quoi renvoyer ? Un tableau d'indices ? ce serait laid) mais une recherche dichotomique multidimensionnelle, je ne vois même pas ce que ça veut dire (à moins que le tableau ne soit trié comme un mono-dimensionnel)

    Première chose : parle t-on vraiment de tableaux multidimensionnels (int[,,]) ou de jagged arrays (int[][]) ? Si c'est la première solution, ceux-ci sont assez lourdingues à manipuler, lents à l'exécution et, souvent, un mono-dimensionnel fait aussi bien l'affaire.

    Deuxième chose : créer son propre IndexOf est l'affaire de trois lignes. Quant à recréer un BinarySearch, rien d'extrêmement difficile non plus, ça prend 20 à 60 minutes en incluant les tests.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je n'arrive pas a mettre la main sur l'equivalent des fonctions array.IndexOf ou meme array.Binarysearch pour ce qui est des Array Multidimensionnelles...
    Pour IndexOf, tu peux l'implémenter assez facilement...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    static class Extensions
    {
        public static int[] IndexOf<T>(this T[,] array, T value)
        {
            return array.IndexOf(value, null);
        }
     
        public static int[] IndexOf<T>(this T[,] array, T value, IEqualityComparer<T> comparer)
        {
            comparer = comparer ?? EqualityComparer<T>.Default;
            int rows = array.GetLength(0);
            int cols = array.GetLength(1);
     
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                    if (comparer.Equals(array[i, j], value))
                        return new[] { i, j };
                }
            }
            return new[] { -1, -1 };
        }
    }
    Pour BinarySearch, j'avoue ne pas trop comprendre l'intérêt dans un tableau multidimensionnel... Que contient ton tableau au juste ? Comment sont organisées les données dedans ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup DonQuiche et Tomlev,

    En fait, pour etre plus clair car mon message manque cruellement de precision, je fais la query Linq ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                Dim Position As Array = (From Row In PositionDataTable.AsEnumerable() _
                                            Where Not Row.ItemArray.Any(Function(c) c Is DBNull.Value) _
                                            Where Row.Field(Of Int32)("Ledger Code") = 2968 _
                                            Where Row.Field(Of DateTime)("Delivery/Prompt date") = Date.Parse("11/11/2011") _
                                            Where (Row.Field(Of String)("Option Type") = "P" Or Row.Field(Of String)("Option Type") = "C") _
                                            Order By Row.Field(Of Double)("Strike") Ascending
                                            Group Row By Strike = Row.Field(Of Double)("Strike") Into g = Group
                                            Select New With _
                                                {
                                                    .K = Strike, _
                                                    .Volume = g.Sum(Function(row) row.Field(Of Int32)("Volume")) _
                                                }).toArray
    Ce que je souhaiterais faire revient a rechercher l'index d'une valeur de K et de me renvoyer le Volume correspondant. Par ailleurs, il semble qu'en fait ma query renvoie une Array unidimensionnelle

    Lorsque j'analyse les donnees en execution, elles se presentent de la facon suivante:

    (0) K=115.0 , Volume=-2
    (1) K=120.0 , Volume= -100
    (2) K=130.0 , Volume = -50

    Il s'agit donc de chercher par exemple l'index de K = 115, afin de retirer la valeur Volume = -100

    Merci par avance de votre aide.

    Anthony

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Effectivement c'est un tableau unidimensionnel... Mais je ne vois pas pourquoi tu as besoin de l'index, tu peux faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim volume = Position.First(Function(p) p.K = 115).Volume

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Points : 27
    Points
    27
    Par défaut
    Merci beaucoup TomLev. Effectivement cela fonctionne tres bien!

    Une petite derniere question, je cherche a passer le resultat de ma requete linq a une sub que j'appelle par la suite. Sauriez vous comment je peux declarer le resultat de ma requete et le passer a une Sub dans laquelle j'utiliserai votre methode?

    J'ai essaye IEnumerable, Array mais cela ne semble rien donner car le probleme doit etre de conserver le type interne (K,olume) de l'array...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                Dim Position = (From Row In PositionDataTable.AsEnumerable() _
                                                    Where Not Row.ItemArray.Any(Function(c) c Is DBNull.Value) _
                                                    Where Row.Field(Of Int32)("Ledger Code") = 2968 _
                                                    Where Row.Field(Of DateTime)("Delivery/Prompt date") = Date.Parse("11/11/2011") _
                                                    Where (Row.Field(Of String)("Option Type") = "P" Or Row.Field(Of String)("Option Type") = "C") _
                                                    Order By Row.Field(Of Double)("Strike") Ascending
                                                    Group Row By Strike = Row.Field(Of Double)("Strike") Into g = Group
                                                    Select New With _
                                                        {
                                                            .K = Strike, _
                                                            .Volume = g.Sum(Function(row) row.Field(Of Int32)("Volume")) _
                                                        }).toArray
    Appel de La Sub:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Sub TableCalculation(ByVal Strikes() As Double,                                ByVal RefVolTable() As Double, ByVal Option As String, ByVal PositionTable As ?????)
     
    For i As Double = LowStrike To HighStrike Step JumpStrike
     
    'Retrieve The Position On This Strike
    Dim OnStrikePosition As Integer = PositionTable.First(Function(p) p.K = i).Volume
    Merci beaucoup pour votre aide

    Anthony

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Un type anonyme ne peut être utilisé qu'au sein d'une même méthode, on ne peut pas le passer en paramètre. Si tu as besoin de faire ça, déclare une classe qui englobe K et Volume

Discussions similaires

  1. haxe - array multidimensionnel avec 2 types de données
    Par Haxor668 dans le forum Flash/Flex
    Réponses: 2
    Dernier message: 28/04/2009, 19h51
  2. Réponses: 7
    Dernier message: 28/09/2008, 16h48
  3. Réponses: 7
    Dernier message: 19/09/2008, 11h27
  4. [Tableaux] Tri d'un array multidimensionnel
    Par amans dans le forum Langage
    Réponses: 3
    Dernier message: 22/04/2008, 16h11
  5. [Tableaux] Récursivité array multidimensionnel
    Par yanice dans le forum Langage
    Réponses: 10
    Dernier message: 30/01/2008, 20h52

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