我正在寻找一种使用通配符搜索.net哈希表中的值的方法

时间:2008-12-02 00:42:46

标签: .net hashtable

我有一大堆存储在.net 2.0哈希表中的值。我真正想要找到的是一种基本上在表上执行SQL select语句的方法。

意思是,我想获得一个键列表,其关联值与一个非常简单的文本模式匹配(沿着“以数字开头”的行。)

最终目标是从哈希表中删除这些记录以进行进一步处理。

我现在一直在打击这个问题一段时间,我似乎无法想出任何东西。

有什么想法吗?

(关于这个问题很重要:由于这个项目的实际情况,任何第三方小部件或升级到更新版本的.net都不在桌面上。)

3 个答案:

答案 0 :(得分:3)

如果你真的在寻找以数字开头的东西,那么你可以比使用正则表达式更快地完成它。只需查看每个键的第一个字符,确定它是否为数字。将您要删除的密钥存储在List中,因为您只需要保留密钥。

    List<string> keysToRemove = new List<string>( myhashtable.Count );
    foreach (string key in myhashtable.Keys)
    {
        if (char.IsDigit(key[0])
        {
            keysToRemove.Add(key);
        }
    }

    foreach (string key in keysToRemove)
    {
        myhashtable.Remove(key);
    }

答案 1 :(得分:2)

您可以对哈希表中的每个键使用正则表达式。这很脏但是有效:

    static void Main(string[] args)
    {
        Hashtable myhashtable = new Hashtable();
        myhashtable.Add("Teststring", "Hello");
        myhashtable.Add("1TestString1", "World");
        myhashtable.Add("2TestString2", "Test");

        List<String> newht = new List<String>;

        //match all strings with a number at the front
        Regex rx = new Regex("^[1-9]");
        foreach (string key in myhashtable.Keys)
        {
            if (rx.IsMatch(key) == true)
            {
                newht.Add(key);
            }
        }

        //Loop through all the keys in the new collection and remove them from
        //them from the main hashtable.
        foreach (string key in newht)
        {
            myhashtable.Remove(key);
        }
    }
编辑:只是为了好玩,这里是LINQ版本(对不起,我也有)。

            Hashtable myhashtable = new Hashtable();
            myhashtable.Add("Teststring", "Hello");
            myhashtable.Add("1TestString1", "World");
            myhashtable.Add("2TestString2", "Test");

            Regex rx = new Regex("^[1-9]");
            var k = (from string key in myhashtable.Keys
                     where rx.IsMatch(key)
                     select key).ToList();

            k.ForEach(s => myhashtable.Remove(s));
编辑:我刚刚添加了sting列表而不是哈希表,我不记得哪个.net版本中有通用列表***拍打前额

答案 2 :(得分:1)

使用LINQ:

Dim myhashtable As New Hashtable
    myhashtable.Add("Teststring", "Hello")
    myhashtable.Add("1TestString1", "World")
    myhashtable.Add("2TestString2", "Test")

For Each i As String In From Element In myhashtable.Cast(Of DictionaryEntry)() Let k = DirectCast(Element.Value, String) Where k.StartsWith("W") Select DirectCast(Element.Key, String)
        MsgBox("This key has a matching value:" & i)
    Next

但如果使用LINQ,最好使用Dictionary:

    Dim d = New Dictionary(Of String, String)()
    d.Add("Teststring", "Hello")
    d.Add("1TestString1", "World")
    d.Add("2TestString2", "Test")

    For Each i As String In From element In d Where element.Value.StartsWith("W") Select element.Key
        MsgBox("This key has a matching value:" & i)
    Next

而不是.StartsWith(“W”)你当然可以做任何你想要的其他过滤。