微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.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(); 
        }
    }

原文地址:https://www.jb51.cc/vb/256299.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐