378 votes

Tableaux C #, obtention d'un sous-tableau à partir d'un tableau existant

J'ai un tableau X de 10 éléments. Je voudrais créer un tableau contenant tous les éléments de X qui commencent à l'indice 3 et se termine à l'indice 7. Sûr que je peux facilement écrire une boucle qui va le faire pour moi, mais je tiens à garder mon code le plus propre possible. Je pense aussi que c'est stupide d'écrire des méthodes qui existe déjà. Est-il une méthode en C# qui peut le faire pour moi?

Quelque chose comme (pseudo-code):

Array NewArray = oldArray.createNewArrayFromRange(int BeginIndex , int EndIndex)

Modifier

Outre les propositions ci-dessous, je voudrais aussi vous demander si la Matrice.copie d'une copie, ou si elle utilise quelque chose d'autre à faire la copie (comme "clone").

Modifier

J'ai commencé une prime parce que personne ne l'ai pas encore de réponse , Tableau.La copie ne convient pas à mes besoins. J'ai besoin d'éléments dans le nouveau tableau pour être des clones. Tableau.la copie est juste un Style C memcpy équivalent, il n'est pas ce que je cherche.

499voto

Marc Gravell Points 482669

Vous pouvez ajouter comme une extension de la méthode:

public static T[] SubArray<T>(this T[] data, int index, int length)
{
    T[] result = new T[length];
    Array.Copy(data, index, result, 0, length);
    return result;
}
static void Main()
{
    int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int[] sub = data.SubArray(3, 4); // contains {3,4,5,6}
}


Mise à jour le clonage (qui n'était pas évident dans la question d'origine). Si vous vraiment voulez une profonde clone; quelque chose comme:

public static T[] SubArrayDeepClone<T>(this T[] data, int index, int length)
{
    T[] arrCopy = new T[length];
    Array.Copy(data, index, arrCopy, 0, length);
    using (MemoryStream ms = new MemoryStream())
    {
        var bf = new BinaryFormatter();
        bf.Serialize(ms, arrCopy);
        ms.Position = 0;
        return (T[])bf.Deserialize(ms);
    }
}

Cela exige que les objets sérialisables ([Serializable] ou ISerializable), bien que. Vous pouvez facilement remplacer n'importe quel autre sérialiseur comme approprié - XmlSerializer, DataContractSerializer, protobuf-net, etc.

Notez qu'au plus profond de clone est difficile sans sérialisation; en particulier, ICloneable est difficile de faire confiance dans la plupart des cas.

343voto

Jon Skeet Points 692016

Vous pouvez utiliser Array.Copy(...) copier dans le nouveau tableau une fois que vous avez créé, mais je ne pense pas qu'il y a une méthode qui crée un nouveau tableau et des copies d'un éventail d'éléments.

Si vous êtes en utilisant .NET 3.5, vous pourriez utiliser LINQ:

var newArray = array.Skip(3).Take(5).ToArray();

mais qui sera un peu moins efficace.

Voir cette réponse à une question similaire pour les options pour des situations particulières.

76voto

Alex Black Points 4967

Avez-vous envisagé d'utiliser ArraySegment?

http://msdn.microsoft.com/en-us/library/1hsbd92d.aspx

39voto

zvolkov Points 9673

Je vois que vous voulez faire le clonage, pas simplement copier des références. Dans ce cas, vous pouvez utiliser. Sélectionnez cette option pour les membres du groupe projet à leurs clones. Par exemple, si vos éléments de mise en œuvre de IClonable, vous pourriez faire quelque chose comme ceci :

33voto

Volker Points 86

Le code suivant fait dans une seule ligne :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X