KeyValuePair<TKey, TValue>
을 사용하는 것이 좋습니다. 왜냐하면 KVP가 구조체이고 사전의 키가되는 것이 개체가 잠시 동안있을 것임을 나타 내기 때문입니다. 대신 Tuple<T1, T2>
을 권하고 싶습니다. 이점은 Tuple이 참조 유형이므로 복사하지 않고 자유롭게 전달할 수 있다는 것입니다. 또한 Tuple은 KVPair와 마찬가지로 읽기 전용 객체입니다. 여기에 쓸 방법은 다음과 같습니다.
class Program
{
static void Main(string[] args)
{
MainCollection<int, string, DateTime> collection = new MainCollection<int, string, DateTime>();
collection.Add(Tuple<int, string>.Create(1, "Bob"), new DateTime(1992, 12, 1));
collection.Add(Tuple<int, string>.Create(2, "James"), new DateTime(1945, 9, 1));
collection.Add(Tuple<int, string>.Create(3, "Julie"), new DateTime(1976, 7, 15));
DateTime date;
date = collection.GetValue(1);
Console.WriteLine("Bob birthdate: {0}", date);
date = collection.GetValue("Julie");
Console.WriteLine("#3 birthdate: {0}", date);
Console.ReadLine();
}
}
public class MainCollection<TKey1, TKey2, TValue>
{
Tuple<TKey1, TKey2> key;
Dictionary<Tuple<TKey1, TKey2>, TValue> mainCollection = new Dictionary<Tuple<TKey1, TKey2>, TValue>();
public void Add(Tuple<TKey1, TKey2> Key, TValue Value)
{
mainCollection.Add(Key, Value);
}
public TValue GetValue(TKey1 Key)
{
return mainCollection.Where(k => k.Key.Item1.Equals(Key))
.Select(v => v.Value)
.FirstOrDefault();
}
public TValue GetValue(TKey2 Key)
{
return mainCollection.Where(k => k.Key.Item2.Equals(Key))
.Select(v => v.Value)
.FirstOrDefault();
}
}
public class Tuple<T1, T2>
{
readonly T1 item1;
readonly T2 item2;
Tuple(T1 item1, T2 item2)
{
this.item1 = item1;
this.item2 = item2;
}
public static Tuple<T1, T2> Create(T1 Item1, T2 Item2)
{
return new Tuple<T1, T2>(Item1, Item2);
}
public T1 Item1
{ get { return item1; } }
public T2 Item2
{ get { return item2; } }
}
}
참고 : .Net 4를 사용하지 않는 경우를 대비하여 튜플 구현을 포함 시켰습니다.0
업데이트 :
이 같을 것이다 여러 사전을 사용하는 MainCollection
개체를 변환 :
public class MainCollection<TKey1, TKey2, TValue>
{
Tuple<TKey1, TKey2> key;
Dictionary<TKey1, Tuple<TKey1, TKey2>> k1Dictionary = new Dictionary<TKey1, Tuple<TKey1, TKey2>>();
Dictionary<TKey2, Tuple<TKey1, TKey2>> k2Dictionary = new Dictionary<TKey2, Tuple<TKey1, TKey2>>();
Dictionary<Tuple<TKey1, TKey2>, TValue> mainCollection = new Dictionary<Tuple<TKey1, TKey2>, TValue>();
public void Add(Tuple<TKey1, TKey2> Key, TValue Value)
{
mainCollection.Add(Key, Value);
k1Dictionary.Add(Key.Item1, Key);
k2Dictionary.Add(Key.Item2, Key);
}
public TValue GetValue(TKey1 Key)
{
return mainCollection[k1Dictionary[Key]];
}
public TValue GetValue(TKey2 Key)
{
return mainCollection[k2Dictionary[Key]];
}
}
왜'TKey1'가'int'이라고 생각합니까? 코드가 의미가 없습니다. – SLaks
KeyValuePair를 사용하는 특별한 이유가 있습니까? 두 개의 키를 저장하기 위해 공용 구조체를 사용하여 간단한 구조체 (Equals 및 GetHashCode 구현)를 사용할 수 있습니다. 위 코드에서 == 연산자는 정적으로 입력되었으므로 Equals 메서드를 사용하여 등호 테스트를 수행해야합니다. – Hasanain
사용중인 .Net 버전은 무엇입니까? .Net 4 인 경우, 키에'Tuple'을 사용하십시오. –
IAbstract