2011-11-19 18 views
9

¿Cómo se establecen las propiedades de un conjunto de colecciones?C# obtener y establecer propiedades para una colección de listas

He creado una clase con propiedades de colección. Quiero agregar a la Lista en cualquier momento que establezca un nuevo valor. Usar _name.Add (value) dentro del método set no funciona.

Section newSec = new Section(); 

newSec.subHead.Add("test string"); 
newSec.subHead.Add("another test string"); 

public class Section 
{ 
    public String head { get; set; } 
    private List<string> _subHead = new List<string>(); 
    private List<string> _content = new List<string>(); 

    public List<string> subHead 
    { 
     get 
     { return _subHead; } 
     set 
     { 
      _subHead.Add(value); 
     } 
    } 
    public List<string> content 
    { 
     get 
     { return _content; } 
     set 
     { 
      _content.Add(value); 
     } 
    } 
} 

de actualización con mi solución:

public class Section 
{ 

    private List<string> _head = new List<string>(); 
    private List<string> _subHead = new List<string>(); 
    private List<string> _content = new List<string>(); 

    public List<string> Head 
    { 
     get 
     { return _head; } 
    } 

    public List<string> SubHead 
    { 
     get 
     { return _subHead; } 
    } 
    public List<string> Content 
    { 
     get 
     { return _content; } 
    } 

    public void AddHeading(string line) 
    { 
     Head.Add(line); 
    } 

    public void AddSubHeading(string line) 
    { 
     SubHead.Add(line); 
    } 

    public void AddContent(string line) 
    { 
     Content.Add(line); 
    } 

} 

Respuesta

17

no sería apropiado para que sea parte de la incubadora - no es como si fueras realmente establecer toda la lista de cadenas - que' Sólo estoy tratando de agregar uno.

Hay algunas opciones:

  • puso AddSubheading y AddContent métodos en su clase, y sólo exponen sólo lectura versiones de las listas
  • exponer a las listas mutables sólo con los captadores, y dejar que las personas que llaman se suman a ellos
  • renunciar a toda esperanza de encapsulación, y simplemente hacer que lean/propiedades de escritura

En el segundo caso, el código puede ser justo:

public class Section 
{ 
    public String Head { get; set; } 
    private readonly List<string> _subHead = new List<string>(); 
    private readonly List<string> _content = new List<string>(); 

    // Note: fix to case to conform with .NET naming conventions 
    public IList<string> SubHead { get { return _subHead; } } 
    public IList<string> Content { get { return _content; } } 
} 

Esta es razonablemente código pragmática, aunque significa que las personas que llaman pueden mutar sus colecciones de forma que quieran, lo que podría no ser ideal. El primer enfoque mantiene el mayor control (solo su código ve la lista mutable) pero puede no ser tan conveniente para las personas que llaman.

Hacer que el colocador de un tipo de colección realmente solo agregue un elemento único a una colección existente no es factible ni tampoco sería agradable, por lo que le aconsejo que abandone esa idea.

+0

Gracias por su ayuda! Intenté ir con la puerta n. ° 1. – SharpBarb

0

Sus incubadores son extraños, por lo que es posible que vea un problema.

En primer lugar, considere si aún necesita estos emisores - si es así, deberían dar un List<string>, no sólo un string:

set 
{ 
    _subHead = value; 
} 

Estas líneas:

newSec.subHead.Add("test string"); 

están llamando a la getter y luego llame al Add en el List<string> devuelto - no se invoca al colocador.

4

Si entiendo su solicitud correctamente, usted tiene que hacer lo siguiente:

public class Section 
{ 
    public String Head 
    { 
     get 
     { 
      return SubHead.LastOrDefault(); 
     } 
     set 
     { 
      SubHead.Add(value); 
     } 

    public List<string> SubHead { get; private set; } 
    public List<string> Content { get; private set; } 
} 

que lo utilice como esto:

var section = new Section(); 
section.Head = "Test string"; 

Ahora "cadena de prueba" se añade a la colección subtítulos y estará disponible a través del captador:

var last = section.Head; // last will be "Test string" 

Espero haber entendido bien.

+1

+1 porque aunque LastOrDefault probablemente no sea la respuesta correcta, no sabía que ese método existía, así que hoy aprendí algo y todo está bien. –

+6

No es justo, no tengo ninguna posibilidad contra Skeet: D – LueTm

+0

@LueTm, ¿por qué definiste SubHead public? –

3

O

public class Section 
{ 
    public String Head { get; set; } 
    private readonly List<string> _subHead = new List<string>(); 
    private readonly List<string> _content = new List<string>(); 

    public IEnumerable<string> SubHead { get { return _subHead; } } 
    public IEnumerable<string> Content { get { return _content; } } 

    public void AddContent(String argValue) 
    { 
    _content.Add(argValue); 
    } 

    public void AddSubHeader(String argValue) 
    { 
    _subHead.Add(argValue); 
    } 
} 

Todo depende de la cantidad de la IMPLANTACIÓN del contenido y subtítulo que desea ocultar.

Cuestiones relacionadas