Existe-t-il une fonction intégrée dans .NET 2.0 qui prendra deux tableaux et les fusionnera en un seul tableau?
Les tableaux sont tous les deux du même type. J'obtiens ces tableaux à partir d'une fonction largement utilisée dans ma base de code et je ne peux pas modifier la fonction pour renvoyer les données dans un format différent.
Je cherche à éviter d'écrire ma propre fonction pour y parvenir si possible.
Array.Resize
ne redimensionne pas réellement le tableau, il le copie. C'est pourquoi le premier paramètre est by-ref (ce qui signifie que votre premier code ne sera probablement pas compilé).Dans C # 3.0, vous pouvez utiliser la méthode Concat de LINQ pour y parvenir facilement:
En C # 2.0, vous n'avez pas un moyen aussi direct, mais Array.Copy est probablement la meilleure solution:
Cela pourrait facilement être utilisé pour implémenter votre propre version de
Concat
.la source
Utilisez LINQ :
Gardez à l'esprit que cela supprimera les doublons. Si vous souhaitez conserver les doublons, utilisez Concat.
la source
Si vous ne souhaitez pas supprimer les doublons, essayez ceci
Utilisez LINQ:
la source
Tout d'abord, assurez-vous de vous poser la question "Dois-je vraiment utiliser un tableau ici"?
À moins que vous ne construisiez quelque chose où la vitesse est de la plus haute importance, une liste dactylographiée, comme
List<int>
c'est probablement le chemin à parcourir. La seule fois où j'utilise des tableaux est pour les tableaux d'octets lors de l'envoi de trucs sur le réseau. A part ça, je ne les touche jamais.la source
List<T>
dans les API publiques: blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspxPlus simple serait simplement d'utiliser LINQ :
Convertissez d'abord les tableaux en listes et fusionnez-les ... Après cela, convertissez simplement la liste en tableau :)
la source
Je pense que vous pouvez utiliser Array.Copy pour cela. Il prend un index source et un index de destination, vous devriez donc pouvoir ajouter un tableau à l'autre. Si vous devez aller plus complexe que simplement ajouter l'un à l'autre, ce n'est peut-être pas le bon outil pour vous.
la source
En supposant que le tableau de destination dispose de suffisamment d'espace,
Array.Copy()
cela fonctionnera. Vous pouvez également essayer d'utiliser aList<T>
et sa.AddRange()
méthode.la source
Personnellement, je préfère mes propres extensions linguistiques, que j'ajoute ou supprime à volonté pour un prototypage rapide.
Voici un exemple pour les chaînes.
C'est beaucoup plus rapide que LINQ et Concat. Plus rapide encore, utilise un
IEnumerable
wrapper de type personnalisé qui stocke les références / pointeurs des tableaux passés et permet de boucler sur toute la collection comme s'il s'agissait d'un tableau normal. (Utile en HPC, traitement graphique, rendu graphique ...)Votre code:
Pour le code complet et une version générique, voir: https://gist.github.com/lsauer/7919764
Remarque: Cela renvoie un objet IEnumerable non étendu. Retourner un objet étendu est un peu plus lent.
J'ai compilé de telles extensions depuis 2002, avec beaucoup de crédits destinés à des gens utiles sur CodeProject et 'Stackoverflow'. Je vais les publier sous peu et mettre le lien ici.
la source
Tout le monde a déjà eu son mot à dire, mais je pense que cela est plus lisible que l'approche "utiliser comme méthode d'extension":
Cependant, il ne peut être utilisé que lors du regroupement de 2 tableaux.
la source
C'est ce que j'ai trouvé. Fonctionne pour un nombre variable de tableaux.
...
la source
Juste pour le noter en option: si les tableaux avec lesquels vous travaillez sont de type primitif - Boolean (bool), Char, SByte, Byte, Int16 (short), UInt16, Int32 (int), UInt32, Int64 (long ), UInt64, IntPtr, UIntPtr, Single ou Double - alors vous pourriez (ou devriez?) Essayer d'utiliser Buffer.BlockCopy . Selon la page MSDN de la classe Buffer :
En utilisant l'exemple C # 2.0 de la réponse de @ OwenP comme point de départ, cela fonctionnerait comme suit:
Il n'y a pratiquement pas de différence de syntaxe entre
Buffer.BlockCopy
etArray.Copy
celle utilisée par @OwenP, mais cela devrait être plus rapide (même si ce n'est que légèrement).la source
Au cas où quelqu'un d'autre chercherait à fusionner deux tableaux d'octets d'image:
la source
Voici un exemple simple utilisant Array.CopyTo. Je pense que cela répond à votre question et donne un exemple d'utilisation de CopyTo - Je suis toujours perplexe quand j'ai besoin d'utiliser cette fonction parce que l'aide est un peu floue - l'index est la position dans le tableau de destination où l'insertion a lieu.
Je suppose que vous ne pouvez pas obtenir beaucoup plus simple.
la source
J'avais besoin d'une solution pour combiner un nombre inconnu de tableaux.
Surpris, personne d'autre n'a fourni de solution
SelectMany
avecparams
.Si vous ne voulez pas d'éléments distincts, supprimez simplement distinct.
Remarque: Il n'y a certainement aucune garantie de commande lors de l'utilisation de distinct.
la source
Je suppose que vous utilisez vos propres types de tableaux par opposition aux tableaux .NET intégrés:
Une autre façon de procéder serait d'utiliser la classe ArrayList intégrée.
Les deux exemples sont C #.
la source
En utilisant le code ci-dessus, deux tableaux peuvent être facilement fusionnés.
la source
Créé et méthode d'extension pour gérer null
la source
Si vous avez les tableaux source dans un tableau lui-même, vous pouvez utiliser SelectMany :
donne
Ce n'est probablement pas la méthode la plus rapide mais pourrait convenir en fonction du cas d'utilisation.
la source
Ce code fonctionnera dans tous les cas:
la source
Essaye ça:
la source