Dot-Net

將 StringCollection 轉換為 List<String>

  • May 10, 2009

通常,我會盡可能選擇List&lt;String&gt;[or, in VB, List(Of String)] :另請參閱*Best string container*。StringCollection

然而,看起來,泛型——因此List&lt;String&gt;——顯然在 VS 2008 的設置設計器中不受支持。因此,如果我想在我的使用者設置中使用字元串列表,我必須求助於使用StringCollection那裡。

現在,由於我不想在StringCollection整個程式碼中看到,我需要將其轉換為List&lt;String&gt;. 我如何有效地做到這一點?或者,更好的是,我錯了,有一種List&lt;String&gt;在設置設計器中使用的方法嗎?

編輯:我必須使用 .NET 2.0。

如果您必須使用.NET 2.0,我想最乾淨的選擇是分別StringCollection為該實現IEnumerable&lt;string&gt;IEnumerator&lt;string&gt;forStringCollection和創建一個包裝器StringEnumerator。(:根據元數據,StringEnumerator未實現IEnumerator)。範例如下。然而,歸根結底,某個地方的某個人將在 上做 a foreach()StringCollection所以有人可能會爭辯說,一個簡單foreach(string item in stringCollection)的添加到List&lt;string&gt;就足夠了;我懷疑這不足以滿足您的需求。

您也可以IList&lt;string&gt;使用這種方法來實現,以節省您複製底層字元串的時間,但您會因“包裝器”類型的委託呼叫(堆棧上的另一個方法呼叫!)而付出代價。我建議您無論如何都根據系統內的介面來處理事物IEnumberable&lt;string&gt;IList&lt;string&gt;而不是具體的列表,它將引導您走上更大靈活性的道路。

   static void Main(string[] args)
   {
       StringCollection stringCollection = new StringCollection();
       stringCollection.AddRange(new string[] { "hello", "world" });

       // Wrap!
       List&lt;string&gt; listOfStrings = new List&lt;string&gt;(new StringCollectionEnumerable(stringCollection));

       Debug.Assert(listOfStrings.Count == stringCollection.Count);
       Debug.Assert(listOfStrings[0] == stringCollection[0]); 

   }

   private class StringCollectionEnumerable : IEnumerable&lt;string&gt;
   {
       private StringCollection underlyingCollection; 

       public StringCollectionEnumerable(StringCollection underlyingCollection)
       {
           this.underlyingCollection = underlyingCollection; 
       }

       public IEnumerator&lt;string&gt; GetEnumerator()
       {
           return new StringEnumeratorWrapper(underlyingCollection.GetEnumerator()); 
       }

       System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
       {
           return this.GetEnumerator(); 
       }
   }

   private class StringEnumeratorWrapper : IEnumerator&lt;string&gt;
   {
       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&lt;string&gt;

var list = stringCollection.Cast&lt;string&gt;().ToList();

關於你的第二個問題,我似乎記得可以List&lt;string&gt;在 Visual Studio 的設置設計器中使用。如果您選擇自定義類型然後瀏覽器到適當的類型,它應該可以工作。但是,我可能會弄錯,所以我需要驗證它。

引用自:https://stackoverflow.com/questions/844412