1

.net 2.0 ハッシュテーブルに格納された値のホスト全体があります。私が本当に見つけたいのは、本質的に、テーブルで SQL 選択ステートメントを実行する方法です。

つまり、関連付けられた値が非常に単純なテキスト パターンに一致するキーのリストを取得したいと考えています (「数字で始まる」という行に沿って)。

最終的な目標は、これらのレコードをハッシュテーブルから削除して、さらに処理することです。

私はしばらくこれに頭を悩ませてきましたが、何も思いつかないようです。

何か案は?

(偶然にも、これは重要です: このプロジェクトの現実により、サードパーティのウィジェットや .net の最新バージョンへのアップグレードは検討されていません。)

4

3 に答える 3

3

数字で始まるものを本当に探しているのであれば、正規表現よりもはるかに速くそれを行うことができます。各キーの最初の文字を見て、それが数字かどうかを判断するだけです。キーを保持するだけでよいので、削除するキーをリストに保存します。

    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);
    }
于 2008-12-02T01:37:11.463 に答える
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));

編集:ハッシュテーブルではなくスティングのリストを追加したところです。どの.netバージョンに一般的なリストが含まれていたか思い出せませんでした***額を平手打ち

于 2008-12-02T00:47:40.470 に答える
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を使用する場合は、辞書を使用することをお勧めします。

    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")の代わりに、もちろん、他の必要なフィルタリングを行うことができます。

于 2008-12-02T01:55:46.777 に答える