Transfert de données d'une List<> vers une autre

Résolu
Whismeril
Messages postés
17680
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
16 août 2022
- Modifié le 5 juin 2013 à 15:15
Whismeril
Messages postés
17680
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
16 août 2022
- 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

7 réponses

dodo7263
Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
14 mai 2013 à 12:06
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
0
Whismeril
Messages postés
17680
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
16 août 2022
613
14 mai 2013 à 14:52
Je ne vois pas bien ce que le clonage apporterais, mais je vais gratter de ce coté.


Whismeril
0
dodo7263
Messages postés
616
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
9 février 2017
6
14 mai 2013 à 15:03
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
0
yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
14 mai 2013 à 22:25
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril
Messages postés
17680
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
16 août 2022
613
14 mai 2013 à 22:50
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
0
Whismeril
Messages postés
17680
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
16 août 2022
613
14 mai 2013 à 22:58
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
0
Whismeril
Messages postés
17680
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
16 août 2022
613
Modifié par Whismeril le 19/06/2015 à 00:02
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
-2