2008-12-02 21 views
1

我有一整套存儲在.net 2.0哈希表中的值。我真正想找到的是一種基本上在表上執行SQL select語句的方法。我正在尋找一種方法來使用通配符搜索.net哈希表中的值

含義,我想拿到鑰匙其關聯值匹配一個非常簡單的文本模式的列表(沿着線「打頭數字」。)

的最終目標是消除這些來自哈希表的記錄用於進一步處理。

我一直在打擊我的頭一陣子,現在我似乎無法拿出任何東西。

任何想法?

(在關閉的機會重要性:由於本項目的實際情況,任何第三方小工具或升級到最新版本的.NET的是假表。)

回答

2

你可以使用對正則表達式hashtable中的每個鍵。這是非常髒,但它的工作原理:

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版本有泛型列表在它***拍打額頭

+0

這就是我對他的情況所建議的。 – 2008-12-02 01:20:44

+0

當我第一次看到問題的時候,我就像是「是!LINQ時間」,然後我看到了.net 2.0,然後是:'(,再次使用foreach循環再次使用lol – 2008-12-02 01:23:08

+0

這是我們追求升級這個系統的展覽之一到.net 3.5。;) – 2008-12-02 01:27:33

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); 
    } 
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」),你當然可以做任何其他過濾你想要的。