通常情况下,我会尽可能选择List<String>
[或在VB中List(Of String)
]而不是StringCollection
:另请参阅 Best string container 。
然而,看起来,仿制药 - 以及List<String>
- 显然在VS 2008的设置设计器中不受支持。因此,如果我想在用户设置中使用字符串列表,我必须在那里使用StringCollection
。
现在因为我不希望在我的代码中看到StringCollection
,我需要将其转换为List<String>
。我该如何有效地做到这一点?或者,更好的是,我错了,有一种方法可以在设置设计器中使用List<String>
吗?
编辑:我必须使用.NET 2.0。
答案 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>
的包装器分别为StringCollection
和StringEnumerator
。 ( 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);