Transfert de données d'une List<> vers une autre [Résolu]

Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 14 mai 2013 à 11:30 - Dernière réponse : Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention
- 5 juin 2013 à 15:15
Bonjour,

il m'arrive parfois d'avoir une classe A contenant une List et que j'ai besoin dans chaque instance de B d'infos venant de A.
    class A
    {
        public string Nom { get; set; }

        public List Bs { get; set; }
    }

    class B
    {
        public string Nom { get; set; }

        public string NomDeA { get; set; }
    }



La plupart du temps je stocke mes données en xml et utilise Linq pour cela.

Une fois que j'ai chargé mes données xml, je fais une double boucle pour associer à chaque B le A qui va bien.
List As = new A();
......
            foreach (A a in As)
                foreach (B b in a.Bs) b.NomDeA = a.Nom;


Je me demandais s'il y a mieux, à part ecire NomDeA dans le xml, parce que le plus souvent les infos que je transferts évoluent en cours de traitement.

Merci d'avance pour toute piste.


Whismeril
Afficher la suite 

7 réponses

Répondre au sujet
dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 14 mai 2013 à 12:06
0
Utile
Salut,

Je dis certainement une bêtise mais tu n'arriverais pas à faire ce que tu veux via la sérialisation + implémentation de l'interface Icloneable ?

SD
Commenter la réponse de dodo7263
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 14 mai 2013 à 14:52
0
Utile
Je ne vois pas bien ce que le clonage apporterais, mais je vais gratter de ce coté.


Whismeril
Commenter la réponse de Whismeril
dodo7263 642 Messages postés mercredi 10 septembre 2008Date d'inscription 9 février 2017 Dernière intervention - 14 mai 2013 à 15:03
0
Utile
Oui en effet c'est un peu tiré par les cheveux mais c'est ce qui m'est venu à l'esprit tout de suite.
De temps en temps, j'utilise la sérialisation pour copier des objets. Je me disais donc que tu pouvais faire ceci avec tes list<> mais pas sur du tout que ce soit ce que tu recherches.

J'ai essayé...

SD
Commenter la réponse de dodo7263
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 14 mai 2013 à 22:25
0
Utile
Salut,

il y a forcément un endroit ou tu ajoutes les instances de B dans la liste de A, du style :

A a1 = new A();
a1.Bs.Add(new B());


Donc, si tu peux rendre ta classe A statique, tu pourrais faire une
Extension sans héritage de l'objet List pour sa fonction Add() en la renommant AddB.
Ce qui te permettrais d'affecter nomDeA dans chaque Add réalisé et d'éviter le foreach

A.Init();
A._Bs.AddB(new B());


Exemple :

public class B
{
    public string _nom;
    public string _nomDeA;
};

public static class A
{
    public static string nomA;
    public static List _Bs;

    public static void Init()
    {
        nomA = "nomA";
        _Bs = new List();
    }

    // <---- ICI extention sans héritage avec this List
    public static void AddB(this List lb, B b)
    {
        b._nomDeA = nomA; //<--- renseigne automatiquement à chaque Add
        lb.Add(b);
    }
};


// Utilisation
B b1 = new B();  // un objet B quelconque
b1._nom = "b1";

A.Init();
A._Bs.AddB(b1); //<----- nomDeA automatiquement renseigné dans b1


La seule contrainte de cette technique et que la classe doit etre statique, ce qui n'est pas vraiment une contrainte...

bye...
Commenter la réponse de yann_lo_san
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 14 mai 2013 à 22:50
0
Utile
Je me sers d'une requette linq pour charger mes listes (j'avais mis un exemple dans ce post), mais du coup la méthode Add n'est pas utilisée.

N'empêche que je retiens le principe, pour le cas ou ça se présenterait.
Je suppose que l'on ne peut pas faire d'extension du constructeur de la liste, mais un héritage pourrait peut être marcher, je regarderais ça demain.

Merci à vous 2.


Whismeril
Commenter la réponse de Whismeril
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 14 mai 2013 à 22:58
0
Utile
Quel âne, je n'ai pas mis le lien de l'exemple.
Le voici

Il ne correspond pas tout à fait au cas que je décrivais plus haut, car dans l'exemple il y avait juste une liste de personnes.
Il faudrait des personnes avec une liste de compétences par exemple.


Whismeril
Commenter la réponse de Whismeril
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - Modifié par Whismeril le 19/06/2015 à 00:02
-2
Utile
Bonjour et encore merci à Yann et Dodo pour vos propositions.

Je n'ai pas réussi à appliquer le clonage.

J'ai fini par trouvé une méthode un peu mieux.
J'ai ajouté un ID à A avec Guid.NewGuid().ToString().
A la création d'un B, je transfert cet ID par la méthode de Yann.

Donc quand j'exporte/importe mes données, chaque B connait l'ID de son A.

Au moment ou j'ai besoin d'une donnée de A, je fais une requete Linq:
//accéder au nom de A
strinf nomDeA = mesA.Where(a=> a.ID = IDdeA).First().Nom;



Whismeril
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.