將 StringCollection 轉換為 List<String>
通常,我會盡可能選擇
List<String>[or, in VB,List(Of String)] :另請參閱*Best string container*。StringCollection然而,看起來,泛型——因此
List<String>——顯然在 VS 2008 的設置設計器中不受支持。因此,如果我想在我的使用者設置中使用字元串列表,我必須求助於使用StringCollection那裡。現在,由於我不想在
StringCollection整個程式碼中看到,我需要將其轉換為List<String>. 我如何有效地做到這一點?或者,更好的是,我錯了,有一種List<String>在設置設計器中使用的方法嗎?編輯:我必須使用 .NET 2.0。
如果您必須使用.NET 2.0,我想最乾淨的選擇是分別
StringCollection為該實現IEnumerable<string>和IEnumerator<string>forStringCollection和創建一個包裝器StringEnumerator。(注:根據元數據,StringEnumerator未實現IEnumerator)。範例如下。然而,歸根結底,某個地方的某個人將在 上做 aforeach(),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(); } }
如果您使用的是 .NET 3.5 ,則轉換
StringCollection為非常簡單。List<string>var list = stringCollection.Cast<string>().ToList();關於你的第二個問題,我似乎記得可以
List<string>在 Visual Studio 的設置設計器中使用。如果您選擇自定義類型然後瀏覽器到適當的類型,它應該可以工作。但是,我可能會弄錯,所以我需要驗證它。