107 votes

qu'est-ce que l'utilisation de ArraySegment<T> de classe?

Je viens de tomber sur ArraySegment<byte> tout type de sous-classement MessageEncoder classe. Commencé à googler pour voir ce qu'il est. Je comprends maintenant que c'est un segment d'un tableau donné, prend un décalage, ce n'est pas énumérable, ne dispose pas d'un indexeur.

Mais je n'arrive toujours pas à comprendre son utilisation? quelqu'un peut-pls. expliquer avec un exemple? Merci.

62voto

Stephen Kennedy Points 1458

Il semble que ce sera beaucoup plus utile .NET 4.5, y compris dans les requêtes LINQ.

MSDN

Voir les interfaces mises en œuvre et l'extension des méthodes qu'ils offrent.

34voto

Hans Passant Points 475940

C'est assez inutile, n'est-ce pas beaucoup utiliser à l'intérieur .NET framework. Il est simplement préférable à l'alternative: faire une copie du tableau segment. C'est cher.

28voto

Greg McNulty Points 615
  1. Tampon partioning IO classes - Utiliser le même tampon pour simultanées opérations de lecture et écriture et ont un unique structure, vous pouvez passer autour de l'décrit l'ensemble de vos opérations.
  2. Les Fonctions de jeu - Mathématiquement parlant, on peut représenter n'importe quel contiguë sous-ensembles à l'aide de cette nouvelle structure. Que, fondamentalement signifie que vous pouvez créer des partitions de la matrice, mais vous pouvez pas dire que toutes les cotes et tous les evens. Notez que le téléphone teaser proposé par The1 pourrait avoir élégamment résolu à l'aide de ArraySegment de partitionnement et d'un arbre structure. Les chiffres définitifs pourraient avoir été écrit en parcourant l'arborescence de parcours en profondeur d'abord. Cela aurait un scénario idéal en termes de de la mémoire et de la vitesse, je crois.
  3. Le Multithreading - Vous pouvez maintenant générer plusieurs threads pour fonctionner sur le même source de données lors de l'utilisation sectorielle des tableaux comme le contrôle de la porte. Boucles que l'usage discret calculs peuvent maintenant être traitée assez facilement, quelque chose que les derniers compilateurs C++ sont de commencer à faire une optimisation de code étape.
  4. L'INTERFACE utilisateur de Segmentation - Contraindre votre INTERFACE utilisateur affiche l'aide sectorielle les structures. Vous pouvez désormais stocker structures représentant les pages de données qui peut rapidement être appliquée à la fonctions d'affichage. Contiguë unique les tableaux peuvent être utilisés pour afficher discret de points de vue, ou même hiérarchique des structures telles que les nœuds dans un TreeView par la segmentation linéaire des données magasin de nœud secteurs de collecte.

Dans cet exemple, nous allons voir comment vous pouvez utiliser le tableau d'origine, le Décalage et le Comte propriétés, et aussi comment vous pouvez faire une boucle à travers les éléments spécifiés dans le ArraySegment.

using System;

class Program
{
    static void Main()
    {
        // Create an ArraySegment from this array.
        int[] array = { 10, 20, 30 };
        ArraySegment<int> segment = new ArraySegment<int>(array, 1, 2);

        // Write the array.
        Console.WriteLine("-- Array --");
        int[] original = segment.Array;
        foreach (int value in original)
        {
            Console.WriteLine(value);
        }

        // Write the offset.
        Console.WriteLine("-- Offset --");
        Console.WriteLine(segment.Offset);

        // Write the count.
        Console.WriteLine("-- Count --");
        Console.WriteLine(segment.Count);

        // Write the elements in the range specified in the ArraySegment.
        Console.WriteLine("-- Range --");
        for (int i = segment.Offset; i < segment.Count+segment.Offset; i++)
        {
            Console.WriteLine(segment.Array[i]);
        }
    }
}

ArraySegment Structure - ce que pensaient-ils?

7voto

nergeia Points 430

Ce qui est à propos d'une classe wrapper? Juste pour éviter de copier des données à temporelle des tampons.

public class SubArray<T> {
        private ArraySegment<T> segment;

        public SubArray(T[] array, int offset, int count) {
            segment = new ArraySegment<T>(array, offset, count);
        }
        public int Count {
            get { return segment.Count; }
        }

        public T this[int index] {
            get {
               return segment.Array[segment.Offset + index];
            }
        }

        public T[] ToArray() {
            T[] temp = new T[segment.Count];
            Array.Copy(segment.Array, segment.Offset, temp, 0, segment.Count);
            return temp;
        }

        public IEnumerator<T> GetEnumerator() {
            for (int i = segment.Offset; i < segment.Offset + segment.Count; i++) {
                yield return segment.Array[i];
            }
        }
    } //end of the class

Exemple:

byte[] pp = new byte[] { 1, 2, 3, 4 };
SubArray<byte> sa = new SubArray<byte>(pp, 2, 2);

Console.WriteLine(sa[0]);
Console.WriteLine(sa[1]);
//Console.WriteLine(b[2]); exception

Console.WriteLine();
foreach (byte b in sa) {
    Console.WriteLine(b);
}

Sortie:

3
4

3
4

3voto

Ian Mercer Points 19271

L'une des réponses à cette question montre une utilisation pratique pour ArraySegment:

À l'aide de LINQ à la recherche d'un tableau d'octets pour tous les sous-tableaux que start/stop avec certaines octet

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