CodeCollection

Espacio de nombres: Digi21.DigiNG.Entities
Ensamblado: Digi21.DigiNG

Colección de los códigos de una entidad. Es el objeto que devuelve Entity.Codes. Cada cambio en la colección se aplica a la entidad.

public class CodeCollection : IList<Code>

Implementa: IList<Code>, ICollection<Code>, IEnumerable<Code>.

El paquete NuGet de referencia Digi21.DigiNG no declara CodeCollection: Entity.Codes es de tipo IList<Code>. El código compilado con el paquete solo usa los miembros de IList<Code>; el indexador por nombre no está disponible.

La clase no tiene constructores públicos.

La colección guarda una copia de cada Code. Code es una estructura: para cambiar un código, lee el elemento, modifícalo y asígnalo otra vez con el indexador.

Si la entidad es de solo lectura (pertenece a un archivo de dibujo), los métodos que modifican la colección lanzan InvalidOperationException.

Propiedades

Propiedad Descripción
int Count { get; } Número de códigos.
bool IsReadOnly { get; } true si la entidad es de solo lectura (Entity.ReadOnly).
Code this[int index] { get; set; } Código de la posición index. Lanza ArgumentOutOfRangeException si index no está entre 0 y Count - 1.
Code this[string name] { get; set; } Primer código cuyo Name es igual a name, sin comodines. Lanza ArgumentOutOfRangeException si no hay ningún código con ese nombre. El descriptor set sustituye ese código. No está en el paquete de referencia.

Métodos

Método Descripción
void Add(Code item) Añade el código al final.
void Insert(int index, Code item) Inserta el código en la posición index. Lanza ArgumentOutOfRangeException si index es negativo o mayor que Count.
void Clear() Quita todos los códigos.
bool Remove(Code item) Quita de la colección y de la entidad el código de la posición que devuelve IndexOf(item): el primero cuyo nombre coincide con item.Name según Code.Compare. Devuelve false si ningún nombre coincide.
void RemoveAt(int index) Quita el código de la posición index. Lanza ArgumentOutOfRangeException si index no está entre 0 y Count - 1.
int IndexOf(Code item) Posición del primer código cuyo nombre coincide con item.Name según Code.Compare, con los comodines * y ?. Devuelve -1 si ninguno coincide. No compara Table ni Id.
bool Contains(Code item) true si IndexOf(item) no devuelve -1: compara el nombre, con los comodines * y ?, y no compara Table, Id ni Attributes.
void CopyTo(Code[] array, int arrayIndex) Copia los códigos en array a partir de arrayIndex.
IEnumerator<Code> GetEnumerator() Enumerador de los códigos.

Excepciones de los métodos que modifican la colección (Add, Insert, Clear, Remove, RemoveAt y los descriptores set de los indexadores):

Excepción Cuándo
InvalidOperationException La entidad es de solo lectura.

Ejemplo

Este programa añade, modifica y quita códigos de una línea y la escribe en un archivo .bind:

using Digi21.DigiNG.Entities;
using Digi21.DigiNG.IO.BinDouble;
using Digi21.Math;

if (args.Length != 1)
{
    Console.WriteLine("Uso: ColeccionCodigos <salida.bind>");
    return 1;
}

var línea = new Line(new Code("020400"));
línea.Points.Add(new Point3D(0, 0, 100));
línea.Points.Add(new Point3D(10, 0, 100));

// Codes es una CodeCollection: cada cambio se aplica a la entidad.
línea.Codes.Add(new Code("040100"));
línea.Codes.Insert(0, new Code("030100"));

// IndexOf compara solo el nombre, con los comodines de Code.Compare.
Console.WriteLine(línea.Codes.IndexOf(new Code("04*")));   // 2

// Code es una estructura: se modifica una copia y se asigna de nuevo.
var código = línea.Codes[1];
código.Visible = 0;
línea.Codes[1] = código;

línea.Codes.RemoveAt(0);

foreach (var c in línea.Codes)
    Console.WriteLine($"{c.Name} {c.Visible:X8}");          // 020400 00000000, 040100 FFFFFFFF

using var archivo = new BinDouble(args[0]);
archivo.Add(línea);

// La línea ya pertenece al archivo: la colección es de solo lectura.
Console.WriteLine(línea.Codes.IsReadOnly);                  // True
return 0;