Concaténer 2 tableaux

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 15 déc. 2005 à 10:45
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre 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
A voir également:

22 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
17 déc. 2005 à 12:45
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#]
3
taoetc Messages postés 346 Date d'inscription lundi 8 septembre 2003 Statut Membre Dernière intervention 3 septembre 2007 3
15 déc. 2005 à 11:03
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
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 11:13
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
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
15 déc. 2005 à 11:21
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
0

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

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 déc. 2005 à 11:27
C'est l'ArrayList qui met en oeuvre la méthode AddRange()

Mx
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 déc. 2005 à 11:27
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#
*/
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 11:31
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.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 déc. 2005 à 11:35
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#]
0
Equinox84 Messages postés 63 Date d'inscription lundi 2 février 2004 Statut Membre Dernière intervention 19 mai 2010
15 déc. 2005 à 11:42
Carrement ! C'est plus facile !
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
15 déc. 2005 à 11:44
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 déc. 2005 à 11:47
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#]
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
15 déc. 2005 à 13:14
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#]
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
15 déc. 2005 à 21:43
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
16 déc. 2005 à 06:42
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#]
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
17 déc. 2005 à 02:51
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
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
17 déc. 2005 à 09:26
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
17 déc. 2005 à 11:26
Merci mais c'est en français que je ne le trouvais pas.


Mathmax
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
17 déc. 2005 à 11:30
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#]
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
17 déc. 2005 à 12:05
Elle ne le sera qu'au moment de la sortie des versions localisées FR de VS il me semble. :-)

/*
coq
MVP Visual C#
*/
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
17 déc. 2005 à 12:32
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
0
Rejoignez-nous