.net – 将StringCollection转换为List

通常,我会选择List< String> [或者,在VB中,List(Of String)] over StringCollection尽可能:另见 Best string container

然而,看起来,泛型 – 因此,List< String> – 显然不支持VS 2008的设置。因此,如果我想在我的用户设置中使用字符串列表,我不得不求助于使用StringCollection。

现在,因为我不想看到我的代码中的StringCollection,我需要将其转换为List< String&gt ;.我如何有效地这样做?或者,更好的是,我错了,有一种方法使用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(); 
        }
    }

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...