Если у вас есть для использования .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();
}
}