양면 자원 사전으로 무엇을 사용할 수 있습니까?
-
08-07-2019 - |
문제
나는 Resourcedictionary를 사용하고 있지만 다른 항목과 함께 값이나 키를 찾아 볼 수 있기를 원합니다. 각각은 항상 독특하므로 문제가되지 않습니다. 이 양면 조회 기능이있는 유형이 있습니까?
해결책
내장되어 있지 않지만 글을 쓰기가 매우 쉽습니다. 그래도 나는 아마 이것에 대한 Identicary를 구현할 것입니다 ... 그러면 Resourcedictionary를 사용자 정의 유형에 버릴 것입니다.
public class DoubleLookup<TKey, TValue>
{
private IDictionary<TKey, TValue> keys;
private IDictionary<TValue, TKey> values;
//stuff...
public void Add(TKey key, TValue value)
{
this.keys.Add(key, value);
this.values.Add(value, key);
}
public TKey GetKeyFromValue(TValue value)
{
return this.values[value];
}
public TValue GetValueFromKey(TKey key)
{
return this.keys[key];
}
}
다른 팁
사전에서 키/가치 관계를 되돌릴 때 매우주의하십시오.
사전의 계약은 컬렉션의 모든 값에 대해 해당 값에 매핑되는 하나의 키가 정확히 하나 있음을 보장합니다. 키는 독특합니다. 그러나 그 반대는 사실이 아닙니다. 모든 뚜렷한 값에 대해, 그 값에 대한 많은 다른 키가있을 수 있습니다.
내 자신의 개인 코드 라이브러리 (충분히 가까운 Java로 작성)에는 이런 종류의 멀티 맵 클래스가 있습니다. 키는 고유하지만 각 키는 여러 값과 연관 될 수 있습니다. 맵과 정확히 동일합니다.
컬렉션에서 Key-to Key 조회를 수행 해야하는 경우 다음과 같은 작업을 수행합니다.
Map<K, V> lookupTable = ...;
MultiMap<V, K> reverseLookupTable = MapUtil.invert(lookupTable);
V value = ...;
if (reverseLookupTable.containsKey(value)) {
Set<K> keys = reverseLookupTable.get(value);
}
리버스 룩업 테이블로 멀티 맵 (해시 맵 또는 사전) 이외의 것을 사용하는 경우 컬렉션의 모든 키와 모든 값을 보장 할 수없는 한 V-> K 매핑의 일부를 잃을 위험이 있습니다. 독특합니다.
편집하다:
죄송합니다. 방금 컬렉션의 모든 키와 값이 독특하다고 말했습니다. 그러나 나는 어쨌든 내 대답을 여기에 남겨두고, 나는 이것을 읽는 다른 사람들을위한 경고로, 동일한 보증을 제공 할 수 없을 수도 있습니다.