Pregunta Convertir StringCollection en List


Normalmente, elegiría List<String> [o, en VB, List(Of String)] encima StringCollection siempre que sea posible: vea también El mejor contenedor de cadena.

Sin embargo, como parece, los genéricos, y por lo tanto, List<String> - aparentemente no son compatibles con el diseñador de configuraciones de VS 2008. Por lo tanto, si quiero usar una lista de cadenas en mi configuración de usuario, tengo que recurrir a usar un StringCollection ahí.

Ahora como yo no quiero ver StringCollection a lo largo de mi código, necesito convertirlo a List<String>. ¿Cómo hago esto de manera eficiente? O, mejor aún, estoy equivocado y hay una manera de usar List<String> en el diseñador de configuraciones?

EDITAR: Tengo que usar .NET 2.0.


36
2018-05-10 00:24


origen


Respuestas:


Si tu tener para usar .NET 2.0, me imagino que la opción más limpia sería crear un contenedor para StringCollection que implementa IEnumerable<string> y IEnumerator<string> para StringCollection y StringEnumerator respectivamente. (Nota: según los metadatos, StringEnumerator no implementa IEnumerator) Muestra a continuación. Sin embargo, al final del día, alguien, en algún lugar va a estar haciendo una foreach() sobre el StringCollection, así que uno podría argumentan que un simple foreach(string item in stringCollection) y añadiendo a la List<string> bastaría; Dudo que esto no sea lo suficientemente performat para sus necesidades.

También podrías implementar IList<string> usando este enfoque también, para ahorrarle la duplicación de las cadenas subyacentes, pero pagará una penalización de tener llamadas delegadas del tipo "envoltorio" (¡una llamada de método más en la pila!). Sugeriría que trate las cosas en términos de interfaces dentro de su sistema de todos modos IEnumberable<string>, IList<string> etc., en lugar de la Lista concreta, te guiará por un camino hacia una mayor flexibilidad.

    static void Main(string[] args)
    {
        StringCollection stringCollection = new StringCollection();
        stringCollection.AddRange(new string[] { "hello", "world" });

        // Wrap!
        List<string> listOfStrings = new List<string>(new StringCollectionEnumerable(stringCollection));

        Debug.Assert(listOfStrings.Count == stringCollection.Count);
        Debug.Assert(listOfStrings[0] == stringCollection[0]); 

    }

    private class StringCollectionEnumerable : IEnumerable<string>
    {
        private StringCollection underlyingCollection; 

        public StringCollectionEnumerable(StringCollection underlyingCollection)
        {
            this.underlyingCollection = underlyingCollection; 
        }

        public IEnumerator<string> GetEnumerator()
        {
            return new StringEnumeratorWrapper(underlyingCollection.GetEnumerator()); 
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator(); 
        }
    }

    private class StringEnumeratorWrapper : IEnumerator<string>
    {
        private StringEnumerator underlyingEnumerator; 

        public StringEnumeratorWrapper(StringEnumerator underlyingEnumerator)
        {
            this.underlyingEnumerator = underlyingEnumerator;
        }

        public string Current
        {
            get
            {
                return this.underlyingEnumerator.Current; 
            }
        }

        public void Dispose()
        {
            // No-op 
        }

        object System.Collections.IEnumerator.Current
        {
            get
            {
                return this.underlyingEnumerator.Current;
            }
        }

        public bool MoveNext()
        {
            return this.underlyingEnumerator.MoveNext(); 
        }

        public void Reset()
        {
            this.underlyingEnumerator.Reset(); 
        }
    }

14
2018-05-10 00:56



Mudado StringCollection a List<string> es maravillosamente simple si estás usando .NET 3.5.

var list = stringCollection.Cast<string>().ToList();

En cuanto a su segunda pregunta, parece recordar que es posible usar List<string> en el diseñador de configuraciones de Visual Studio. Si selecciona el tipo personalizado y luego el navegador al tipo apropiado, debería funcionar. Sin embargo, podría confundirme con eso, así que tendré que verificarlo.


89
2018-05-10 00:30



stringCollection.Cast<string>().ToList()


13
2018-04-15 12:55



¿Por qué no mantenerlo simple y solo iterarlo y agregar los elementos a la lista, o he entendido mal algo?

public static List<string> Convert(StringCollection collection)
{
    List<string> list = new List<string>();
    foreach (string item in collection)
    {
        list.Add(item);
    }
    return list;
}

5
2018-05-10 00:43



Si está usando C # 3.0 y .NET 3.5, puede crear una lista usando

var list = new List<string>(new StringCollection().Cast<string>());

A la inversa es:

var c = new StringCollection();
c.AddRange(new List<string>().ToArray());

2
2018-05-10 00:32



C # 2.0

StringCollection colString = new StringCollection();
string[] arrString = new string[colString.Count];
colString.CopyTo(arrString, 0);
List<string> lstString = new List<string>(arrString);

2
2018-02-11 13:34