通常,我会选择List< String> [或者,在VB中,List(Of String)] over StringCollection尽可能:另见
Best string container。
然而,看起来,泛型 – 因此,List< String> – 显然不支持VS 2008的设置。因此,如果我想在我的用户设置中使用字符串列表,我不得不求助于使用StringCollection。
现在,因为我不想看到我的代码中的StringCollection,我需要将其转换为List< String> ;.我如何有效地这样做?或者,更好的是,我错了,有一种方法使用List< String>在设计设计师?
编辑:我必须使用.NET 2.0。
如果你必须使用.NET 2.0,我会想象最干净的选择是创建一个包装器StringCollection实现IEnumerable< string>和IEnumerator< string>分别用于StringCollection和StringEnumerator。 (注意:根据元数据,StringEnumerator不实现IEnumerator)。下面的示例。然而,在一天结束时,某人将在StringCollection上做一个foreach(),所以可以认为一个简单的foreach(stringCollection中的字符串项)并添加到List< string>就足够了;我怀疑这不会是足够满足您的需求。
你也可以实现IList< string>使用这种方法,保存你重复的底层字符串,但你会支付一个惩罚,“包装器”类型委托调用(在堆栈上多一个方法调用!)。我建议你处理在系统中的接口的事情无论如何IEnumberable< string>,IList< string>等等,而不是具体的List,它会引导你走一条更大的灵活性的道路。
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(); } }