将StringCollection转换为List <string> </string>

时间:2009-05-10 00:24:11

标签: .net vb.net generics

通常情况下,我会尽可能选择List<String> [或在VB中List(Of String)]而不是StringCollection:另请参阅 Best string container

然而,看起来,仿制药 - 以及List<String> - 显然在VS 2008的设置设计器中不受支持。因此,如果我想在用户设置中使用字符串列表,我必须在那里使用StringCollection

现在因为我不希望在我的代码中看到StringCollection,我需要将其转换为List<String>。我该如何有效地做到这一点?或者,更好的是,我错了,有一种方法可以在设置设计器中使用List<String>吗?

编辑:我必须使用.NET 2.0。

6 个答案:

答案 0 :(得分:98)

如果您使用的是.NET 3.5,则将StringCollection转换为List<string>非常简单。

var list = stringCollection.Cast<string>().ToList();

关于第二个问题,我似乎记得可以在Visual Studio的设置设计器中使用List<string>。如果您选择自定义类型然后浏览器到适当的类型,它应该工作。但是,我可能会误解,所以我需要验证它。

答案 1 :(得分:16)

stringCollection.Cast<string>().ToList()

答案 2 :(得分:15)

如果 使用.NET 2.0,我认为最干净的选择是为StringCollection创建一个实现IEnumerable<string>IEnumerator<string>的包装器分别为StringCollectionStringEnumerator。 ( note :根据元数据,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(); } } 等,而不是具体的列表,它将引导您走向更灵活的道路。

{{1}}

答案 3 :(得分:5)

为什么不保持简单,只是迭代它并将项目添加到列表中,或者我误解了什么?

public static List<string> Convert(StringCollection collection)
{
    List<string> list = new List<string>();
    foreach (string item in collection)
    {
        list.Add(item);
    }
    return list;
}

答案 4 :(得分:3)

如果您使用的是C#3.0和.NET 3.5,则可以使用

创建列表
var list = new List<string>(new StringCollection().Cast<string>());

另一种方式是:

var c = new StringCollection();
c.AddRange(new List<string>().ToArray());

答案 5 :(得分:2)

C#2.0

StringCollection colString = new StringCollection();
string[] arrString = new string[colString.Count];
colString.CopyTo(arrString, 0);
List<string> lstString = new List<string>(arrString);