Подтвердить что ты не робот

Преобразование StringCollection в список <String>

Как правило, я выбирал List<String> [или, в VB, List(Of String)] над StringCollection, когда это возможно: см. также Лучший контейнер строк.

Однако, как кажется, дженерики - и, следовательно, List<String> -, по-видимому, не поддерживаются в конструкторе настроек VS 2008. Поэтому, если я хочу использовать список строк в моих пользовательских настройках, я должен прибегнуть к использованию StringCollection там.

Теперь, когда я не хочу видеть StringCollection во всем моем коде, мне нужно преобразовать его в List<String>. Как это сделать эффективно? Или, еще лучше, я ошибаюсь, и есть способ использовать List<String> в конструкторе настроек?

EDIT: я должен использовать .NET 2.0.

4b9b3361

Ответ 1

Если вам нужно использовать .NET 2.0, я бы предположил, что самым чистым вариантом будет создание обертки для StringCollection, которая реализует IEnumerable<string> и IEnumerator<string> для StringCollection и StringEnumerator соответственно. (примечание: согласно метаданным StringEnumerator не реализует IEnumerator). Пример ниже. Однако в конце дня кто-то будет где-то делать foreach() по StringCollection, поэтому можно утверждать, что достаточно простого foreach(string item in stringCollection) и добавления в List<string>; Я сомневаюсь, что это не будет достаточно для ваших нужд.

Вы также можете реализовать IList<string>, используя этот подход, чтобы сохранить дублирование основных строк, но вы заплатите штраф за вызовы делегатов типа "обертка" (еще один вызов метода в стеке!), Я бы посоветовал вам рассматривать вещи в терминах интерфейсов внутри вашей системы в любом случае IEnumberable<string>, IList<string> и т.д. Вместо конкретного списка, это поможет вам преодолеть путь к большей гибкости.

    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(); 
        }
    }

Ответ 2

Преобразование StringCollection в List<string> удивительно просто, если вы используете .NET 3.5.

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

Что касается вашего второго вопроса, я действительно вспоминаю, что в конструкторе параметров Visual Studio можно использовать List<string>. Если вы выбираете пользовательский тип, то браузер подходит к соответствующему типу, он должен работать. Тем не менее, я могу ошибаться в этом, поэтому мне нужно его проверить.

Ответ 3

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

Ответ 4

Почему бы не сохранить его простым и просто перебрать его и добавить элементы в список, или я что-то не понял?

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

Ответ 5

Если вы используете С# 3.0 и .NET 3.5, вы можете создать список, используя

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

Другой способ:

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

Ответ 6

С# 2.0

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