2014-05-10 47 views
4

我試圖刪除與條件匹配的IDictionary對象中的所有元素。刪除所有與IDictionary中的條件匹配的項目

E.g. IDictionary包含一組鍵和相應的值(比方說80個對象)。鍵是字符串,值可能是不同的類型(想想使用directshow從wtv文件中提取元數據)。

一些鍵包含文本「拇指」,例如, thumbsize,startthumbdate等 我想從IDictionary中刪除所有對象,它們的鍵包含單詞縮略圖。

我在這裏看到的唯一方法是使用.Remove方法手動指定每個鍵名稱。

有沒有辦法讓所有對象的鍵都包含單詞縮略圖,並將它們從IDictionary對象中移除。

的代碼看起來是這樣的:

IDictionary sourceAttrs = editor.GetAttributes(); 

的getAttributes被定義爲:

public abstract IDictionary GetAttributes(); 

我沒有過的getAttributes控制,它會返回一個IDictionary對象,我只知道的內容在調試時查看它。 (可能是一個哈希表)

更新:最終的答案感謝Tim:

sourceAttrs = sourceAttrs.Keys.Cast<string>() 
       .Where(key => key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1) 
       .ToDictionary(key => key, key => sourceAttrs[key]); 
+0

什麼是真正的類型?如果它實際上是一個通用的ditionary,你可以簡單地施放它。您可以嘗試通過「as」運算符來投射它。例如:'var dict = sourceAttrs as Dictionary '。如果演員不工作,則它爲空。 –

+0

不知道,看起來像一個散列表 rboy

+0

請不要包含有關在問題標題中使用的語言的信息,除非它沒有它沒有意義。標籤用於此目的。 –

回答

6

所以你要刪除其中關鍵包含一個子字符串的所有條目。

您可以通過保持使用LINQ所有不包含它:

dict = dict 
    .Where(kv => !kv.Key.Contains("thumb")) 
    .ToDictionary(kv => kv.Key, kv => kv.Value); 

如果你想有一個區分大小寫的比較,你可以使用IndexOf:根據

dict = dict 
    .Where(kv => kv.Key.IndexOf("thumb", StringComparison.CurrentCultureIgnoreCase) == -1) 
    .ToDictionary(kv => kv.Key, kv => kv.Value); 

更新到你的非通用編輯:

如果它是一個非g像HashTable eneric字典,你不能直接使用LINQ,但如果你知道,關鍵是string可以使用下面的查詢:

// sample IDictionary with an old Hashtable 
System.Collections.IDictionary sourceAttrs = new System.Collections.Hashtable 
{ 
    {"athumB", "foo1"}, 
    {"other", "foo2"} 
}; 

Dictionary<string, object> newGenericDict = sourceAttrs.Keys.Cast<string>() 
    .Where(key => !key.Contains("thumb")) 
    .ToDictionary(key => key, key => sourceAttrs[key]); 

但也許它實際上是一個通用的Dictionary,你可以嘗試鑄造與as運算符:

var dict = sourceAttrs as Dictionary<string, object>; 

如果演員表不工作,則爲null。

+0

我沒有where方法與IDictionary對象(我已經包括system.linq和使用.net4客戶端框架) – rboy

+0

@rboy:你需要像IDictionary <字符串, object> dict = new Dictionary ()' –

+0

我將編輯問題以添加更多細節,我不知道IDictionary包含什麼。它通過抽象接口返回給我。 – rboy