2014-05-10 4 views
4

조건과 일치하는 IDictionary 개체의 모든 요소를 ​​제거하려고합니다.IDictionary에서 조건과 일치하는 모든 항목 제거

예. IDictionary에는 키 세트와 해당 값이 들어 있습니다 (80 개의 오브젝트라고합시다). 키는 문자열이며, 값은 다른 유형일 수 있습니다 (directshow를 사용하여 wtv 파일에서 메타 데이터를 추출하는 것을 생각하십시오).

일부 키에는 "thumb"이라는 텍스트가 들어 있습니다. thumbsize, startthumbdate 등 IDictionary에서 모든 객체를 제거하려면 누구의 키에 thumb이라는 단어가 포함되어 있어야합니다.

여기서 볼 수있는 유일한 방법은 수동으로 .Remove 메서드를 사용하여 각 키 이름을 지정하는 것입니다.

키에 누가 thumb이라는 단어가 들어있는 모든 개체를 가져올 수있는 방법이 있으며 IDictionary 개체에서 제거합니다.

코드는 다음과 같습니다로

IDictionary sourceAttrs = editor.GetAttributes(); 

GetAttributes가 정의 : 나는 GetAttributes을 제어 할 수 없습니다

public abstract IDictionary GetAttributes(); 

, 그것이 IDictionary 개체를 반환거야, 난 단지로 내용을 알고 디버깅하는 동안 그것을보고. (가능성이 해시)

UPDATE : 팀에 대한 최종 답변 감사합니다 :

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

실제 유형은 무엇입니까? 실제로 그것이 일반 디디 션이라면 간단히 캐스팅 할 수 있습니다. 'as'연산자를 통해 try-cast 할 수 있습니다. 예를 들면 다음과 같습니다 :'var dict = sourceAttrs as Dictionary '. 캐스트가 작동하지 않으면 null입니다. –

+0

모르겠다. 가 포함 된 해시 테이블처럼 보입니다. – rboy

+0

질문 제목에 사용 된 언어에 대한 정보가 없으면 이해할 수없는 정보는 포함하지 마십시오. 태그는 이러한 용도로 사용됩니다. –

답변

6

그래서 당신은 키가 하위 문자열을 포함하는 모든 항목을 제거 할.

당신은 유지하여 LINQ를 사용할 수 있습니다 하지을 않는 모두를 포함 :

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

업데이트 따라 :

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

당신이 IndexOf를 사용할 수있는 경우를 구분 비교를 원하는 경우 비 일반 편집 :

비 g

// 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]); 

하지만 어쩌면 실제로, 당신은 as으로 캐스팅하려고 수있는 일반적인 Dictionary : 당신이 키를 사용하면 쿼리 다음 사용할 수있는 string 것을 알고있는 경우 HashTable 같은 eneric 사전은 직접 LINQ를 사용하지만, 수 없습니다 연산자 :

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

캐스트가 작동하지 않으면 null입니다.

+0

IDictionary 개체가 포함 된 Where 메서드 (system.linq를 포함하고 .net4 클라이언트 프레임 워크를 사용하여) 위치가 없습니다. – rboy

+0

@rboy : IDictionary dict = new Dictionary ()' –

+0

자세한 내용을 추가하기 위해 질문을 편집 하겠지만 IDictionary에 포함 된 내용을 모르겠습니다. 그것은 추상 인터페이스에 의해 나에게 돌려 보내진다. – rboy

관련 문제