Modification dynamique de la taille d'un tableau

Soyez le premier à donner votre avis sur cette source.

Vue 17 157 fois - Téléchargée 323 fois

Description

Lorseque l'on créer un tableau, il n'est pas possible d'en modifier la taille. ou tout du moins s'en utiliser d'artifice. Cette classe regroupe quelques outils pour palier à ce problème. Elle ne fonctionne pour l'instant qu'avec des tableaux monodimentionels.

Source / Exemple :


using System;

namespace ConsoleApplication1
{
	/// <summary>
	/// Tool library.
	/// </summary>
	public class ArrayTool
	{
		public ArrayTool()
		{
		}

		/// <summary>
		/// Add an item to the end of the array. Rise the array and add the item into the new cell
		/// </summary>
		/// <param name="sourceArray">Array source</param>
		/// <param name="itemNew">New item to add</param>
		public static System.Array addItem( System.Array sourceArray, Object itemNew)
		{
			if (itemNew==null)
				throw(new ArgumentNullException ("itemNew"));

			if (sourceArray==null)
				throw(new ArgumentNullException ("sourceArray"));

			Type arrayType = sourceArray.GetType();
			Type elmntType = arrayType.GetElementType();
			int length = sourceArray.Length;

			Array targetArray=Array.CreateInstance( elmntType, length + 1 );
			Array.Copy( sourceArray, sourceArray.GetLowerBound(0), 
				targetArray, targetArray.GetLowerBound(0), sourceArray.Length );

			targetArray.SetValue( itemNew, targetArray.GetUpperBound(0));

			return targetArray;
		}

		/// <summary>
		/// Insert an item to the specific location.
		/// </summary>
		/// <param name="sourceArray">Array source</param>
		/// <param name="itemNew">New item to add</param>
		/// <param name="index">Num of the cell position to add the new item</param>
		public static System.Array insertItem( Object[] sourceArray, Object itemNew, int index)
		{
			if (sourceArray==null)
				throw (new ArgumentNullException ("sourceArray"));

			if (sourceArray.Length==0)
				throw(new ArgumentException	("Empty array"));

			if (index<0 || index>=sourceArray.Length)
			{
				throw (new ArgumentException ("index"));
			}

			Type arrayType = sourceArray.GetType();
			Type elmntType = arrayType.GetElementType();
			int length = sourceArray.Length;

			Array targetArray=Array.CreateInstance( elmntType, length + 1 );
			Array.Copy( sourceArray, targetArray, index);
			targetArray.SetValue( itemNew, index);
			Array.Copy( sourceArray, index,	targetArray, index + 1, (sourceArray.Length - index) );

			return targetArray;
		}

		/// <summary>
		/// Remove an index item to the array
		/// </summary>
		/// <param name="sourceArray">Array source</param>
		/// <param name="index">Num of the cell position to be removed</param>
		public static System.Array deleteItem( Object[] sourceArray, int index)
		{
			if (sourceArray==null)
				throw (new ArgumentNullException ("sourceArray"));

			if (sourceArray.Length==0)
				throw(new ArgumentException	("Empty array"));

			if (index<0 || index>=sourceArray.Length)
			{
				throw (new ArgumentException ("index"));
			}

			Type arrayType = sourceArray.GetType();
			Type elmntType = arrayType.GetElementType();
			int length = sourceArray.Length;

			Array targetArray=Array.CreateInstance( elmntType, length - 1 );
			Array.Copy( sourceArray, targetArray, index);
			Array.Copy( sourceArray, index + 1,	targetArray, index, (sourceArray.Length - index - 1) );

			return targetArray;
		}

		/// <summary>
		/// Merge two array on one
		/// </summary>
		/// <param name="arrayLeft">Array source left</param>
		/// <param name="arrayRight">Array source right to add at the end of the left array</param>
		public static System.Array mergeArrays( System.Array arrayLeft, System.Array arrayRight)
		{
			if (arrayLeft==null)
				throw(new ArgumentNullException ("arrayLeft"));

			if (arrayRight==null)
				throw(new ArgumentNullException ("arrayRight"));

			int lengthLeft = arrayLeft.Length;
			int lengthRight = arrayRight.Length;

			if (lengthLeft==0)
				throw(new ArgumentException	("Empty array"));

			if (lengthRight==0)
				throw(new ArgumentException	("Empty array"));

			Type arrayTypeLeft = arrayLeft.GetType();
			Type elmntTypeLeft = arrayTypeLeft.GetElementType();
			Type arrayTypeRight = arrayRight.GetType();
			Type elmntTypeRight = arrayTypeRight.GetElementType();

			Boolean result = elmntTypeLeft.Equals(elmntTypeRight);

			if( !result)
				throw(new ArrayTypeMismatchException ("The Source and destination arrays are of not same type"));
				
			Array targetArray=Array.CreateInstance( elmntTypeLeft, lengthLeft + lengthRight );
			Array.Copy( arrayLeft, arrayLeft.GetLowerBound(0), 
				targetArray, targetArray.GetLowerBound(0), arrayLeft.Length );

			Array.Copy( arrayRight, arrayRight.GetLowerBound(0), 
				targetArray, arrayLeft.GetUpperBound(0)+1, arrayRight.Length );

			return targetArray;
		}
	}
}

Conclusion :


Ceci n'étant pas la classe ultime, il existe bien entendue des listes et autres array types dans le frameWork. Mais cette classe peut rendre quelques services. Dans l'attente d'une intégration du multidimention il faut se contenter d'une seule.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
10
Date d'inscription
mercredi 7 avril 2010
Statut
Membre
Dernière intervention
22 septembre 2010
1
bonjur je veux savoir comment accéder a les derniers nombres succicive dans un tableau
exemple:
3/2/1/5/7/8/9/10/11
je veux: 7/8/9/10/11
merci;
Messages postés
8
Date d'inscription
vendredi 22 février 2002
Statut
Membre
Dernière intervention
12 avril 2003

dans mon exemple j'ai juste oublié en ligne 3 :
list = new ArrayList();

mais vous vous en doutez :p
Messages postés
8
Date d'inscription
vendredi 22 février 2002
Statut
Membre
Dernière intervention
12 avril 2003

la classe ArrayList contient la méthode ToArray pour ca :

MyClass[] tableau;
ArrayList list;

list.Add( new MyClass() );
list.Add( new MyClass() );

tableau = (MyClass[])list.ToArray( MyClass );
Messages postés
105
Date d'inscription
mardi 15 janvier 2002
Statut
Membre
Dernière intervention
14 avril 2005

Certe. Mais le pb était à la base le fait que certaines méthodes dans des classes qui utilisaient comme paramètres des tableaux d'objets, des collection d'autres fois, ....

J'utilisait dans des projets des arraylist, des collections. Mais a j'avais souvent des problèmes de casting. D'ou cette classe
Je suis conscient que cela génère pas mal de travail pour le garbage collector si l'on utilise de manière non parsimonieuse.
Messages postés
161
Date d'inscription
mardi 19 juin 2001
Statut
Membre
Dernière intervention
10 avril 2007
1
Waou, tu imagines seulement de ce que représente des copy de tableaux pour chaque action ???

Non, la vraie solution est d'utiliser un ArrayList.

++

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.