Concaténer 2 tableaux [Résolu]

Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
- - Dernière réponse : cs_mathmax
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
- 17 déc. 2005 à 12:57
Bonjour,

Je cherche déséspérement une fonction qui me permettrait de concaténer des tableaux. Ce que j'ai trouvé et qui me parait le plus approprié pour le moment serait d'utiliser un Add ou AddRange, mais je ne sais pas comment m'en servir. Je ne suis, de plus, pas du tout sûr que ça soit la bonne méthode...
Pourriez-vous me donner un petit coup de pouce s'il vous plait ?

Merci d'avance ;-)


Mathmax
Afficher la suite 

Votre réponse

20/22 réponses

Meilleure réponse
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
3
Merci
Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tab2.Length);

Recopie les données du tableau 2 à partir de l'index 0 dans le tableau tabResult à partir de l'index tab1.Legnth. Et ce, seulement tab2.Length items.

à noté que la complexité de cette méthode est O(n)... où est le nombre d'élément copiés.

Sébastien FERRAND
[MVP C#]

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de sebmafate
Messages postés
346
Date d'inscription
lundi 8 septembre 2003
Dernière intervention
3 septembre 2007
0
Merci
ca ca doit marcher, mais resultat pas garanti



string[] tab =
new
string[5];


.....

ArrayList result=
new ArrayList();


.....

result.AddRange((ICollection) tab);


Be happy , by
Tao
Commenter la réponse de taoetc
Messages postés
63
Date d'inscription
lundi 2 février 2004
Dernière intervention
19 mai 2010
0
Merci
Comme le marque taoect il faut que tu utilises la méthodes AddRange et que le tableau (tab) que tu rajoute implémente l'interface ICollection.

Mais par rappart a ton code taoect, si le tableau ne l'implemente pas tu risque de lever une exception InvalidCastException
Commenter la réponse de Equinox84
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
0
Merci
Ca ne semble pas marcher. Voilà ce que je voudrais faire :
mettre bout à bout ces 2 tableaux :
string[] tab1 = {"aa","bb"}
string[] tab2 = {"cc","dd"}

J'ai donc essayé de faire :
tab2 .AddRange((ICollection) tab1);

comme tu me l'as conseillé, mais il semble que AddRange ne soit pas connu dans ce contexte...


Mathmax
Commenter la réponse de cs_mathmax
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
C'est l'ArrayList qui met en oeuvre la méthode AddRange()

Mx
Commenter la réponse de MorpionMx
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Salut,

Heu personnellement je pencherais plutôt pour la déclaration d'un tableau de dimension égale à la somme des dimensions des 2 autres puis une copie des éléments.

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
Messages postés
63
Date d'inscription
lundi 2 février 2004
Dernière intervention
19 mai 2010
0
Merci
C'est normal, AddRange ne fonction que pour les tableaux de taille dynamique.

Deja, il faudrais que tu expliques quel genre de tableau tu veux utiliser, soit des tableau d'objet simple comme ceux que tu montres string[], ou int[]

dans ce cas il faut que tu crées une fonction dans le genre :

public string[] Concatener(string[] tab1, string[] tab2)
{
int TailleNouveauTableau = tab1.Length + tab2.Length;

string[] tableauConcatene = new string[TailleNouveauTableau];

int i=0;

foreach(string s in tab1)
{
tableauConcatene[i] = s
i++;
}

foreach(string s in tab2)
{
tableauConcatene[i] = s
i++;
}

return tableauConcatene;
}

ca devrai etre bon dans un premier temps, mais doit y'avoir moyen de faire plus simple, lol.
Commenter la réponse de Equinox84
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
je ferais comme coq... beaucoup plus rapide, et moins gourmand en mémoire...

donc :
string[] tab1 = {"aa","bb"}
string[] tab2 = {"cc","dd"}

string[] tabResult = new string[tab1.Length + tab2.Length];

tab1.CopyTo(tabResult, 0);
Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tabResult.Length);

(à tester)

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
63
Date d'inscription
lundi 2 février 2004
Dernière intervention
19 mai 2010
0
Merci
Carrement ! C'est plus facile !
Commenter la réponse de Equinox84
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Et certainement plus performant que les foreach ;)
Mais bon, c'est une méthode tout a fait valable aussi. On est pas obligé de tout connaitre

Mx
Commenter la réponse de MorpionMx
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
l'idée biensûr, c'est d'en faire une méthode

du style :
private string[] ConcatArray(string[] tab1, string[] tab2) {
string[] tabResult = new string[tab1.Length + tab2.Length];

tab1.CopyTo(tabResult, 0);
Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tabResult.Length);

return tabResult;
}

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
pour ceux qui aiment les Generics, une solution passe-partout ;)


private T[] ConcatArray<T>(T[] tab1, T[] tab2) {
T[] tabResult =
new T[tab1.Length + tab2.Length];

tab1.CopyTo(tabResult, 0);

Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tabResult.Length);

return tabResult;
}

donc, on l'utilise comme ceci :

string[] t1 = {"one", "two"};
string[] t2 = {"three", "four", "five"};
string[] t3 = ConcatArray<string>(t1, t2);

// t3 contient : {"one", "two", "three", "four", five"}

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
0
Merci
J'ai essayé ta solution sebmafate, mais j'obtiens le message d'erreur suivant :
"Source array was not long enough. Check srcIndex and length, and the array's lower bounds."
sur la ligne :
Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tabResult.Length);


Mathmax
Commenter la réponse de cs_mathmax
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
c'est ma faute, je n'ai pas testé... voici la correction :

private string[] ConcatArray(string[] tab1, string[] tab2) {
string[] tabResult = new string[tab1.Length + tab2.Length];

tab1.CopyTo(tabResult, 0);
Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tab2 .Length);

return tabResult;
}

et (pour les generics)


private T[] ConcatArray<T>(T[] tab1, T[] tab2) {
T[] tabResult =
new T[tab1.Length + tab2.Length];

tab1.CopyTo(tabResult, 0);

Array.ConstrainedCopy(tab2, 0, tabResult, tab1.Length, tab2.Length);

return tabResult;
}

en fait, la longueur est celle du tableau source... et non du tableau de destination.

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
0
Merci
Merci ça marche impécablement.
C'est bizarre, j'ai cherché sur msdn comment marche la fonction ConstrainedCopy, mais il semble qu'il n'y ait rien dessus.


Mathmax
Commenter la réponse de cs_mathmax
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
Commenter la réponse de MorpionMx
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
0
Merci
Merci mais c'est en français que je ne le trouvais pas.


Mathmax
Commenter la réponse de cs_mathmax
Messages postés
4947
Date d'inscription
lundi 17 février 2003
Dernière intervention
14 février 2014
0
Merci
pour l'instant la librairie MSDN pour le framework 2.0 n'est pas disponible en FR... enfin, je ne crois pas.

Sébastien FERRAND
[MVP C#]
Commenter la réponse de sebmafate
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Elle ne le sera qu'au moment de la sortie des versions localisées FR de VS il me semble. :-)

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
Messages postés
404
Date d'inscription
vendredi 28 octobre 2005
Dernière intervention
31 août 2008
0
Merci
ok, quelqu'un pourrait m'expliquer en gros ce que fait cette fonction dans l'exemple de sebmafate parce que moi et l'anglais ça fais 2

merci d'avance.


Mathmax
Commenter la réponse de cs_mathmax

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.