Neden Net'te OrderedDictionary'nın genel bir uygulaması yok?


26

Microsoft neden OrderedDictionary'nın genel uygulamasını sağlamadı?

Gördüğüm birkaç özel uygulama var, bunlardan bazıları: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

Ancak Microsoft neden bunu temel .net kütüphanesine dahil etmedi? Elbette, genel oluşturmama nedenleri vardı .... peki nedir?

Bu mesajı göndermeden önce şunu gördüm: https://stackoverflow.com/questions/2629027/no-generic-implementation-of-ordereddictionary

Ama bu sadece var olmadığını doğruluyor. Değil neden böyle bir şey yok.

Teşekkürler


2
Her zaman var SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Travis Gockel

2
SortedDict belgelerini yanlış anlamadığım sürece, istediğim bu değil. Herhangi bir sıralama yapılmasını istemiyorum. Sadece anahtarla da erişebileceğim bir dizi istiyorum. Her neyse, MS'in bunu neden atladığını gerçekten merak ediyorum. (İnce konular, vb.)
1

Sıralı bir sözlük için tipik bir kullanım örneği nedir? Kafamın üstünden bir tane düşünmek için mücadele ediyorum.
Carson63000

1
@Carson her zaman, aynı zamanda hızlı bir şekilde rasgele erişmeniz gereken bir dizi veri öğesine sahip olursunuz. Basitçe bir Dict'te saklamak sipariş bilgilerini kaybeder ve bir dizi kullanmak kendi dizininizi korumanızı gerektirir.
Kasım’da 03 Kasım’da

2
Eric Lippert'den sorunuzu okumasını ve cevaplamasını isteyin. Genelde bu tür bir soruya yardım etmekte çok makbule geçer. Onun blog aracılığıyla onunla bağlantı kurabileceğinizi düşünüyorum: blogs.msdn.com/b/ericlippert
devuxer

Yanıtlar:


17

In C # 4.0 A Ceviz kabuğu Bunu okumak:

  1. Bir OrderedDictionarybir birleşimidir HashTableveArrayList
  2. Genel yok ArrayList
  3. "Dijital olmayan ArrayListsınıf, temel olarak Framework 1.x ile geriye dönük uyumluluk için kullanılıyor ..."
  4. "Bir ArrayListfonksiyonel olarak benzer List<object>"
  5. "Yansıma, sayısal olmayan bir değerle ArrayListdaha kolaydır List<object>"

Sonuç?

Genel değil, OrderedDictionaryçünkü yapının altında yatan, genel versiyona sahip olmayan (gayri resmi) amortismanlı bir sınıftır.


4
Bu soruya gerçekten cevap vermiyor. Genel bir OrderedDictionary açıkçası genel bir Sözlük ve genel Liste üzerinde oluşturulabilir.
JacquesB

Sınıf kullanımı ilkesi, UI'nin uygulama ile kimin ilgilendiğini değiştirmemesi durumunda değişmez mi? Diyelim ki, dil tasarımı / derleyici ekibi, jenerik olmayan emsali miras almayı tercih ediyor olabilir . Benim spidey hissim boggles. Yeni başlayanlar için: Farklı (hemen) atalar , kovaryans ve kontra varyansı için evrim yolunda bir yerde bir mayın OrderedDictionarymıdır?
radarbob

15

OrderedDictionaryEğer aşırı indeksleme işlemi böylece bir tamsayı o indeksleme Npozisyonunda madde alacak N, bir ile dizine eklerken Objecto nesneye coresponding öğeyi alacaktır. Kimse bir oluşturmak için olsaydı OrderedDictionary<int, string>denilen myDict, ürünleri ekleyen (1, "George") ve (0, "Fred") bu sırayla, gerektiği myDict[0]"George" ya da "Fred" return?

Böyle bir sorun, anahtar tipine bir sınıf kısıtı getirilerek çözülebilirdi. Öte yandan, genel koleksiyonların kullanışlılığının çoğu, değer türleriyle verimli çalışabilmelerinden kaynaklanmaktadır. Anahtar tipine bir sınıf kısıtlaması getirmek biraz çirkin görünebilir.

Sınıfın CLS ile uyumlu olması gerekmiyordu, ancak sadece vb.net ile çalışması gerekiyorsa, adlandırılmış dizine alınmış özelliklerin kullanılması için mantıklı bir tasarım kullanılmış olabilir. Böylece, yukarıdaki örnekte myDict.ByKey[0]"Fred" myDict.BySequence[0]vermiş ve "George" vermiş olacaktı. Ne yazık ki, C # gibi diller adlandırılmış dizinlenmiş özellikleri desteklemiyor. Bir kişi, yukarıdaki sözdiziminin, bu özellikler olmadan bile kullanılmasına izin verecek bir şeyi klud etmiş olsa da, işe yaramaz hale gelmesi Pointve Rectanglebunun için myDict.ByKey[0] = "Wally"çalışmak gibi myDict.ByKeyyeni bir sınıf nesnesine geri dönmesi gerekecektir. Bir yapı daha verimli olur, ancak derleyiciler salt okunur bir yapıya yazma gibi görünen şeyleri reddederdi (mülkün döndüğü yapıyı değiştirmemesine rağmen)ByKey, ancak bunun yerine başvuruda bulunduğu koleksiyonu değiştirin).

Şahsen, ekleme sırasını takip ettiği belirtilen bir sözlük-ish nesnesinin olması güzel bir şey olacağını düşünüyorum; Ayrıca, belirli bir anahtarla ilişkilendirilmiş anahtarı kolayca döndürebilecek bir sözlük-ish nesnesine sahip olmak isterdim (bu nedenle, örneğin bir büyük küçük harf duyarlı sözlüğe sahipse ve "GEORGE" tuşuyla bir kayıt eklediyse, bir KeyValuePairbir numaralandırmada döndürülen tüm nesneleri aramak zorunda kalmadan, söz konusu anahtarın "George" ile ilişkili olduğunu sorabilir .


3

Çünkü düzeni korumak O (1) IDictionary'in ima ettiği sonucu önler, çünkü daha az performans ekleyen / çıkartan ve bellek kullanımını artıran iki koleksiyon (sipariş için bir tane, arama için bir tane) sarmazsanız, Idictionary'nin ima ettiği sonucu engeller. Veya daha az bellek kullanımı karşılığında daha yavaş arama yapabilirsiniz.

Tahminime göre burada 'açıkça daha iyi' bir seçenek yoktu, bu yüzden standart kütüphaneye girmedi. Özellikle 2.0 civarında, C # hala Java'nın hatalarından ders alıyordu. Java'nın 'her şey ve mutfak lavabosu' standart kütüphanesindeki koleksiyonlara yaklaşımı da önlenebilecek bir şey olarak görülse şaşırmam.


1
Daha az hafıza karşılığında daha yavaş arama yapabilmek sadece etkili OrderedDictionarybir şekilde List. Meşru bir kullanım vakası olan herkesin, OrderedDictionaryözellikle O (1) araması olan bir koleksiyon sınıfına ihtiyaç duyduğundan, ancak ekleme sırasını da hatırladığından, ek bellek kullanmanın kaçınılmaz olduğu ve dolayısıyla kabul edilebilir olduğu için kullandığını hayal ediyorum .
Abion47
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.