int[] x = new int [] { 1, 2, 3};
int[] y = new int [] { 4, 5 };
int[] z = // your answer here...
Debug.Assert(z.SequenceEqual(new int[] { 1, 2, 3, 4, 5 }));
En ce moment j'utilise
int[] z = x.Concat(y).ToArray();
Existe-t-il une méthode plus simple ou plus efficace?
Réponses:
la source
params
paramètres à nombre variable .System.IO.Directory.GetFiles()
renvoie un tableau de chaînes.Essaye ça:
la source
List<int> list = new List<int>(x);
Vous pouvez écrire une méthode d'extension:
Ensuite:
la source
Copy
plus rapide queCopyTo
? Envie d'élaborer?J'ai opté pour une solution plus générale qui permet de concaténer un ensemble arbitraire de tableaux unidimensionnels du même type. (Je concatène 3+ à la fois.)
Ma fonction:
Et l'utilisation:
la source
params T[][]
pourthis T[][]
en faire une extension.Ça y est:
la source
int[] result = array1.ToList().Concat(array2.ToList()).toArray();
vous ne pouvez pas appliquer Concat sur des tableaux directement, je croistoArray()
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to 'string[]'. An explicit conversion exists (are you missing a cast?)
int[] result = ?
, vous cachez le problème de votre réponse derrière vousvar
en ce que votre résultat seraIEnumerable<int>
nonint[]
. (l'une des raisons pour lesquelles je n'aime pasvar
les retours de méthode).ToArray()
appel, ce code ne retournera pas un tableau réel, donc c'est aussi une réponse incorrecte.Vous pouvez retirer l'appel ToArray () de la fin. Y a-t-il une raison pour laquelle vous avez besoin que ce soit un tableau après l'appel à Concat?
L'appel de Concat crée un itérateur sur les deux tableaux. Il ne crée pas de nouveau tableau, vous n'avez donc pas utilisé plus de mémoire pour un nouveau tableau. Lorsque vous appelez ToArray, vous créez en fait un nouveau tableau et utilisez la mémoire du nouveau tableau.
Donc, si vous avez juste besoin d'itérer facilement les deux, appelez simplement Concat.
la source
Je sais que l'OP n'était que légèrement curieux de performances. Ces tableaux plus grands peuvent obtenir un résultat différent (voir @kurdishTree). Et que cela n'a généralement pas d'importance (@ jordan.peoples). Néanmoins, j'étais curieux et j'ai donc perdu la tête (comme l'expliquait @TigerShark) .... Je veux dire que j'ai écrit un test simple basé sur la question d'origine .... et toutes les réponses ....
Le résultat a été:
Lancez vos propres victoires.
la source
CopyTo
il sera le plus rapide et ~ 3 fois plus rapide queRoll your own
.Soyez prudent avec la
Concat
méthode. La post concaténation de tableau en C # explique que:Sera inefficace pour les grands tableaux. Cela signifie que la
Concat
méthode est uniquement pour les tableaux de taille moyenne (jusqu'à 10000 éléments).la source
la source
Plus efficace (plus rapide) à utiliser
Buffer.BlockCopy
plusArray.CopyTo
,J'ai écrit un programme de test simple qui «réchauffe la gigue», compilé en mode de publication et l'ai exécuté sans débogueur attaché, sur ma machine.
Pour 10 000 000 d'itérations de l'exemple de la question
Si je modifie les tableaux de test en deux séquences de 0 à 99, j'obtiens des résultats similaires à cela,
À partir de ces résultats, je peux affirmer que les méthodes
CopyTo
etBlockCopy
sont beaucoup plus efficaces queConcat
et, en outre, si la performance est un objectif,BlockCopy
a une valeur supérieure àCopyTo
.Pour mettre en garde contre cette réponse, si les performances n'ont pas d'importance, ou s'il y aura peu d'itérations, choisissez la méthode que vous trouvez la plus simple.
Buffer.BlockCopy
offre une certaine utilité pour la conversion de type au-delà de la portée de cette question.la source
Réponse tardive :-).
la source
La structure la plus efficace en termes de RAM (et CPU) pour contenir le tableau combiné serait une classe spéciale qui implémente IEnumerable (ou si vous le souhaitez dérive même de Array) et relie en interne les tableaux d'origine pour lire les valeurs. AFAIK Concat fait exactement cela.
Dans votre exemple de code, vous pouvez cependant omettre le .ToArray (), ce qui le rendrait plus efficace.
la source
Désolé de faire revivre un vieux fil, mais qu'en est-il de ceci:
Puis dans votre code:
Jusqu'à ce que vous appeliez
.ToArray()
,.ToList()
ou.ToDictionary(...)
, que la mémoire ne soit pas allouée, vous êtes libre de «créer votre requête» et d'appeler l'un de ces trois pour l'exécuter ou simplement de les parcourir tous en utilisant laforeach (var i in z){...}
clause qui renvoie un élément à la fois à partir de layield return t;
au dessus...La fonction ci-dessus peut être transformée en extension comme suit:
Donc, dans le code, vous pouvez faire quelque chose comme:
Le reste est le même qu'avant.
Une autre amélioration à ce serait en train de changer
T[]
dansIEnumerable<T>
( de sorte que leparams T[][]
deviendraitparams IEnumerable<T>[]
) pour rendre ces fonctions acceptent plus que des tableaux.J'espère que cela t'aides.
la source
Vous pouvez le faire comme vous l'avez mentionné, ou si vous voulez être vraiment manuel à ce sujet, vous pouvez rouler votre propre boucle:
la source
J'ai trouvé une solution élégante d'une ligne utilisant l' expression LINQ ou Lambda , les deux fonctionnent de la même manière (LINQ est converti en Lambda lorsque le programme est compilé). La solution fonctionne pour tout type de tableau et pour n'importe quel nombre de tableaux.
Utilisation de LINQ:
Utilisation de Lambda:
J'ai prévu les deux selon ses préférences. Performance sage de @Sergey Shteyn ou de @ deepee1 solutions sont un peu plus rapide, l' expression Lambda étant le plus lent. Le temps nécessaire dépend du ou des types d'éléments de tableau, mais à moins qu'il y ait des millions d'appels, il n'y a pas de différence significative entre les méthodes.
la source
Ce dont vous devez vous souvenir, c'est que lorsque vous utilisez LINQ, vous utilisez une exécution différée. Les autres méthodes décrites ici fonctionnent toutes parfaitement, mais elles sont exécutées immédiatement. De plus, la fonction Concat () est probablement optimisée de manières que vous ne pouvez pas faire vous-même (appels aux API internes, appels au système d'exploitation, etc.). Quoi qu'il en soit, à moins que vous n'ayez vraiment besoin d'essayer et d'optimiser, vous êtes actuellement sur la voie de "la racine de tous les maux";)
la source
Essayez ce qui suit:
la source
Voici ma réponse:
Cette méthode peut être utilisée au niveau de l'initialisation, par exemple pour définir une concaténation statique de tableaux statiques:
Cependant, il est livré avec deux mises en garde que vous devez considérer:
Concat
méthode crée un itérateur sur les deux tableaux: elle ne crée pas de nouveau tableau, ce qui est efficace en termes de mémoire utilisée: cependant, leToArray
annulera cet avantage, car il créera en fait un nouveau tableau et occupera la mémoire du nouveau tableau.Concat
serait plutôt inefficace pour les grands tableaux: il ne devrait être utilisé que pour les tableaux de taille moyenne.Si viser la performance est un must, la méthode suivante peut être utilisée à la place:
Ou (pour les fans de one-liners):
Bien que cette dernière méthode soit beaucoup plus élégante, la première est nettement meilleure pour les performances.
Pour plus d'informations, veuillez vous référer à cet article sur mon blog.
la source
Pour int [] ce que vous avez fait me semble bien. la réponse d'astander fonctionnerait également bien
List<int>
.la source
Pour les tableaux plus petits <10000 éléments:
la source
Je pense que la solution ci-dessus est plus générale et plus légère que les autres que j'ai vues ici. Il est plus général car il ne limite pas la concaténation pour seulement deux tableaux et est plus léger car il n'utilise ni LINQ ni List.
Notez que la solution est concise et que la généralité ajoutée n'ajoute pas de surcharge d'exécution importante.
la source
int [] x = new int [] {1, 2, 3}; int [] y = new int [] {4, 5};
int [] z = x.Union (y) .ToArray ();
la source
Union
n'est pas un très bon moyen de le faire car il appelleDistinct
et supprime implicitement tous les doublons de la collection jointe.Concat
c'est beaucoup mieux, mais c'est déjà dans la question d'origine.la source