【问题标题】:VB Collection - Convert to a modern collectionVB 集合 - 转换为现代集合
【发布时间】:2012-06-26 10:17:10
【问题描述】:

我需要将 VB 集合转换为现代集合,例如 Dictionary 或 Hashtable。对于我的方法,我需要 Collection 的 KEYS。谷歌搜索告诉我这是不可能的。

使用新集合重写整个应用程序不是一种选择,因为该应用程序确实又旧又大(从 VB6 转换为 VB.Net)。 使用旧的 Collection 也不好 - 因为有新的组件正在开发中。

将一个 - 例如 - Hashtable 转换为 Collection 工作:

 using VBCollection = Microsoft.VisualBasic.Collection;
 public static VBCollection ToVBCollection(this Hashtable table)
    {
        var collection = new VBCollection();
        foreach (DictionaryEntry  pair in table)
        {
            collection.Add(pair.Value, pair.Key as string);
        }
        return collection;
    }

转换一个 VBCollection 不会,因为我不知道如何检索密钥:

 using VBCollection = Microsoft.VisualBasic.Collection;
  public static Hashtable ToHashtable(this VBCollection Collection)
    {
        var table = new Hashtable();

        foreach (var pair in Collection)
        {
            table.Add(pair.Key, pair.Value); //I need the key and the corresponding value
        }
        return table;
    }

有什么建议吗?如果确实不可能检索密钥(谢谢,Microsoft),那么我应该如何将 VB COllection 转换为现代的东西?

提前致谢

【问题讨论】:

    标签: c# vb.net collections key


    【解决方案1】:

    如果要求对您现有的代码库产生尽可能小的影响,我会为 Collection 编写一个替代品。编写自己的类会很容易(如果不是有点乏味的话),该类公开所有与 VB 集合相同的方法,但还包括返回键的其他方法。您可以从一些内置的 .NET 集合类型继承,也可以只使用 compisition 来包装 Hashtable。然后,您可以在转换后的 VB.NET 应用程序中更改 Imports 子句,以包括 Microsoft.VisualBasic.Collection 的 Collection intsead。


    为了它,我将发布一个替代但更复杂的解决方案。您可以使用反射来获取 VB 集合对象在内部使用的私有字典。有了它,您可以迭代密钥。这比其他方法更像是一种黑客攻击,但应该同样有效。一个警告是,如果 MS 更改类的内部结构,访问类的私有成员很容易被破坏。

    【讨论】:

    • 听起来很有道理,谢谢。不幸的是,我没有想到这个简单的想法:P
    • vb6 风格的Collection 提供的一个功能(模拟起来有点棘手)是能够在迭代时删除集合中的项目(假设存储在集合中的每个对象都保留了它的钥匙)。不幸的是,Dictionary 没有提供实现等效行为的简单方法,尽管 ConcurrentDictionary 可能会。
    • 为了完全模拟一个集合,我认为你需要一个用于键控查找的字典和一个用于支持前后插入的双链表,并支持可以处理删除的迭​​代器飞。
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2015-05-14
    • 2014-11-02
    • 2013-12-16
    • 2015-09-24
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多