2012-01-25 3 views
9

"좋아요"로 사전 키를 찾을 수 있습니까? , 나는 "와 같은"또는 .StartsWith()을하고 싶습니다사전 키를 "좋아"하는 방법?

mydict.ContainsKey(keyName); 

을 그러나 일부 키 이름은 (공백으로 구분) 추가 추가 단어를 가지고 : 나는 현재하고 있어요. 비교 결과는 다음과 같습니다.

"key1" == "key1" //match 
"key1" == "key1 someword" //partial match 

두 경우 모두 일치해야합니다.

+0

무엇을 반환 하시겠습니까? 키 값 또는 존재하는 경우? – kd7

답변

16

LINQ를 사용하여이 작업을 수행 할 수 있습니다.

bool anyStartsWith = mydict.Keys.Any(k => k.StartsWith("key1"))

이 방법은 .ContainsKey 방법보다 성능이 더있을 것이라는 점을 지적하고, 필요에 따라 가치가

bool anyContains = mydict.Keys.Any(k => k.Contains("key1"))

, 성능 저하 :

는 다음 두 가지 예 눈에 띄지 않습니다.

mydict.ContainsKey(someKey); // O(1) 
mydict.Keys.Any(k => k.StartsWith("key1")); // O(n) 
2
mydict.Keys.Any(k => k.StartsWith("key1")); 

하면 Keys 당신이 사전의 성능 이점을 잃게됩니다 이상 열거하는 동안 평등. LINQ 확장 메서드 검사 일 필요는 없지만 가장 간단합니다.

+1

사실, OP가 사전에 이렇게하는 이유가 궁금합니다. –

0
var keys = (from key mydict.keys where key.contains(keyName) select key).ToList(); 
0

사전의 키 멤버보다 더 복잡한 의미와 존재를 확인하기 위해 조작 할 수 있습니다

1

사전을 사용하지 않고 문자열의 .Contains() 메서드를 실행하면 원하는 결과를 얻을 수 있습니다.

string match = "key1"; 

    var matches = from k in mydict 
         where k.Key.Contains(match) 
         select new 
         { 
          k.Key 
         }; 
0

당신은 키 자체가 아니라이 참/거짓 당신이 할 수있는합니다.

public static class Extensions 
{ 
    public static bool HasKeyLike<T>(this Dictionary<string, T> collection, string value) 
    { 
     var keysLikeCount = collection.Keys.Count(x => x.ToLower().Contains(value.ToLower())); 
     return keysLikeCount > 0; 
    } 

    public static List<string> GetKeysLike<T>(this Dictionary<string, T> collection, string value) 
    { 
     return collection.Keys.Select(x => x.ToLower().Contains(value.ToLower())).ToList(); 
    } 
} 
0

일치하고 이러한 확장을 사용할 수 있습니다 "와 같은"키를 검색하는 경우 :

var matchingKeys = mydict.Keys.Where(x => x.Contains("key1")); 
관련 문제