Concaténer 2 tableaux [Résolu]

cs_mathmax 404 Messages postés vendredi 28 octobre 2005Date d'inscription 31 août 2008 Dernière intervention - 15 déc. 2005 à 10:45 - Dernière réponse : cs_mathmax 404 Messages postés vendredi 28 octobre 2005Date d'inscription 31 août 2008 Dernière intervention
- 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

22 réponses

Meilleure réponse
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 17 déc. 2005 à 12:45
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#]

Merci sebmafate 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de sebmafate
taoetc 346 Messages postés lundi 8 septembre 2003Date d'inscription 3 septembre 2007 Dernière intervention - 15 déc. 2005 à 11:03
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
Equinox84 63 Messages postés lundi 2 février 2004Date d'inscription 19 mai 2010 Dernière intervention - 15 déc. 2005 à 11:13
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
cs_mathmax 404 Messages postés vendredi 28 octobre 2005Date d'inscription 31 août 2008 Dernière intervention - 15 déc. 2005 à 11:21
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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 15 déc. 2005 à 11:27
0
Merci
C'est l'ArrayList qui met en oeuvre la méthode AddRange()

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


Mathmax
Commenter la réponse de cs_mathmax
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 17 déc. 2005 à 11:30
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 17 déc. 2005 à 12:05
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
cs_mathmax 404 Messages postés vendredi 28 octobre 2005Date d'inscription 31 août 2008 Dernière intervention - 17 déc. 2005 à 12:32
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.