Ответ 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();
}
}