KeyValuePair yerine Tuple kullanmak ne zaman daha iyidir?


91

KeyValuePair<TKey,TValue>Birinin diğeri için anahtar olduğu anlamında, çift bağlantılı bir veriye sahip olduğumda, genellikle türü kullandım . Veriler ilgisizse, Tuple<T1,T2>tür daha mantıklı olur ve ben onunla giderim.

Şimdi neden genellikle kaçınılması ve tercih edilmesi gerektiği ile ilgili bu makaleyi okudum . Birincil argüman performans avantajıdır .KeyValuePair<TKey,TValue>Tuple<T1,T2>Tuple<T1,T2>

Dış performans, bir KVP'nin a'dan daha iyi bir seçim olmasının bir nedeni var Tuple<T1,T2>mı?


4
A KeyValuePairbir anahtar ve bir değerdir, a Tuple<T1,T2>sadece bir çift eşit değerdir . Ayrıca şunu da sorabilirsiniz: "Kullanabiliyorsam neden a List<Class>kullanmalıyım Dictionary<A,B>".
Tim SCHMELTER

4
Doğru, ama bu durumda verileri aramak için anahtarı kullanabilirsiniz. Bir anlamı var. Bu durumda, isimler sadece anlamsaldır, (işlemci için) hiçbir şey ifade etmezler.
Nick Gotch

1
Bir demet bir çift eşit değer değildir, ancak bazı eşit türlerdir. Belki bu nitpicking olarak görülür, ancak örneğin C eşit değerlerin farklı temsilleri için birleşim yapısına sahiptir. :)
Jonas

Yanıtlar:


68

Birincisi, tipin kötü adlandırılmış olduğu düşünülebilir. Adlandırılmış bir KeyValuePair, bir anahtarı ve bir değeri temsil etmelidir. Ya iki nesneniz gerçekten bir anahtar ve değer değilse, sadece iki şeyse? Bir türü olan bir yöntem veya özellik görecek KeyValuePair<TKey, TValue>olsaydım, KVP'nin değerlerinin bir anahtar ve bir değer olmasını beklerdim. Bu gerçekten sadece bir niyet iletme ve bunu gelecekte kendinize veya muhtemelen diğer ekip üyelerine açıklığa kavuşturma meselesidir. Bir demet, bu tür bir ilişkiyi göstermez.

Tuples ayrıca başka bir değer eklemeyi kolaylaştırır, onu 3'lü (veya üçlü, ancak nasıl adlandırmak isterseniz) yapar. F # gibi bazı .NET dillerinin de tuple'lar etrafında özel sözdizimi vardır .

Bir uygulama perspektifi için Tuplebirçok şey KeyValuePairyapmaz. Tuple'lar karşılaştırılabilir, IComparableve IStructuralEquatablearabirimlerini uygularlar , böylece iki tuple karşılaştırmayı kolaylaştırır.


1
KeyValuePairs'i bir sözlüğe koymanın zor yolunu buldum ama o zamanlar asla bir sonuç alamayacaksın.
MKesper

3
Ek olarak, yeni C # 7.0, Tuples için yeni, daha basit sözdizimini destekler, bu da onları KeyValuePairs'e göre çok daha kolay ve daha performanslı hale getirir . visualstudiomagazine.com/articles/2017/01/01/…
Jacob Stamm

1
Ayrıca, parametreleri demetler halinde isimlendirme yeteneği, tüketicinin ne için kullanılması gerektiğini anlamasını kolaylaştırır. KVP gibi bir jenerikte, gerçekten kimsenin tahminidir - bir yerde özel olarak belgelenmediği sürece - anahtarın "olması" gerekir - yani türü değil, bir ortam adı, sosyal güvenlik numarası, vb.
rory.ap

40

KeyValuePairyapıdır ve Tuplebir sınıftır.

Bu, nesnelerin referans veya değerlerle nasıl kopyalandığını etkileyen temel farktır.

ve bu nedenle Tuple<T1,T2>, dolaştırıldığında 32bit işletim sisteminde sadece "4 bayt" kullanır, oysa KeyValuePair<K,V>"K ve V" ye dayalı daha fazlasını gerektirir

Her neyse, Tuple ve KeyValuePair'i karşılaştırmak iyi bir fikir değil (benim için mantıklı değil) çünkü ikisi de farklı bir amaca hizmet ediyor.


3
Nasıl farklı bir amaca hizmet ediyorlar? lütfen detaylandırır mısın?
OldSchool

2
@YakRangi keyvaluepair, bir sözlükteki anahtarlar ve değerler için bir kap olarak kullanılmak üzere tasarlanmıştır, aksi takdirde hiçbir amaca hizmet etmez. Öte yandan Tuple, keyfi olarak ilişkili üyeleri bir arada saklamak için kullanılabilir. Ayrıca Tuple ile yalnızca 2 değil, birden fazla üyeyi de depolayabilirsiniz.
Sriram Sakthivel

1
@SriramSakthivel Bu, OP sorusunun cevabının şu olduğu anlamına gelir: Sözlüğe göz atmıyorsanız KVP kullanmayın.
Alex Fainshtein

24

Anlambilime rağmen, her iki seçeneği de göz önünde bulundurduğunuz için performans önemli bir faktör olabilir. Daha önce bahsedildiği gibi KeyValuePair, bir değer türüdür (yapı), oysa Tuple<>bir başvuru türüdür (sınıf). Bu nedenle, KeyValuePairyığın Tuple<>üzerinde tahsis edilir ve yığın üzerinde tahsis edilir ve en uygun seçim genellikle Yığın ve Yığın Bellek Tahsisi'nin klasik argümanları tarafından belirlenir . Kısaca, yığın alanı sınırlıdır, ancak genellikle çok hızlı erişime sahiptir. Yığın bellek çok daha büyüktür ancak biraz daha yavaştır.

KeyValuePair<T1, T2>anahtar ve değer her iki tür de ilkel (değer türleri gibi ise daha iyi olabilir int, bool, doublevs.) ya da küçük boyutta yapılar. Yığın üzerindeki ilkel türlerle, ayırma ve ayırma çok hızlıdır. Bu, özellikle özyinelemeli yöntem çağrılarının argümanları olarak performansı gerçekten etkileyebilir.

Öte yandan, referans türlerden biri veya bunlarsa (sınıflar gibi) Tuple<T1, T2>muhtemelen daha iyi bir seçimdir . Bir (anahtar veya değer türleri gibi) referans türlerine işaretçiler içerir sıralama yenilgilerden nesneler beri amacı zaten öbek üzerinde baktı gerekecektir.T1T2KeyValuePair

İşte çevrimiçi bulduğum bir kıyaslama: Tuple ve KeyValuePair . Bu karşılaştırmaya tek sorun onlar test olmasıdır KeyValuePair<string, string>VS. Tuple<string, string>ve stringtip bir değer türü ve / veya yürütme bağlama bağlı bir referans türü gibi hem davranabilmesi de .NET alışılmadık ve özel bir türüdür. Bence, KeyValuePair<int, int>karşı açık bir kazanan olurdu Tuple<int, int>. Eksikliklerle bile, sonuçlar performans farklılıklarının önemli olabileceğini gösteriyor:

8,23 ns - Tuple Ayır
0,32 ns - KeyValuePair Ayır (25 kat daha hızlı!)

1,93 ns - Tuple'ı bağımsız değişken olarak geçirin
2,57 ns - AnahtarValuePair'i bağımsız değişken olarak geçirin

1,91 ns - Dönüş Tuple
6,09 ns - Dönüş Anahtar Değer Çifti

2.79 ns - Listeden
Tuple'ı Yükle 4.18 ns - Listeden KeyValuePair'i Yükle


0

Gerçekten yanlış soruyu soruyorsunuz, doğru soru bir Sınıf (Tuple) _ kullanmaktır _ bir Struct'tan (KVP) daha iyidir, bu durumda is yanıtı onları ne için kullanmak istediğinizdir ve cevap burada Structs'a karşı sınıflardır.


2
Doğru soruyu sordu. Hangi kullanım için hangisinin daha iyi olduğu sorusu açıkça ima edilmektedir.
Greg

Sorusu daha çikolata veya soda edildiği @Greg Ancak belirli soru anlamsızdır ve daha iyi yiyecek ve içecek konusunda genel soru olarak ele
miket

3
Asıl soru "Tuples vs KeyPairs'i ne zaman kullanmalıyım?" Dir. Bu meşru bir sorudur. Sanırım "daha iyi" kelimesinin anlambilimine takılıp kaldın.
Greg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.