2009-03-09 14 views
2

Bunun mümkün olduğundan şüphe duyuyorum, ancak bir sözlükte 2'den fazla öğeye (anahtar, değer) sahip olabileceğinizi merak ettim. Belki bir anahtar ve 2 değer. Buna izin veren bir koleksiyon nesnesi var mı? Aslında yapmaya çalıştığım şey, anahtar için bir anahtar ve bir değer ve anahtarın kaç kez bulunmuş olduğu kadarını tutmak için başka bir değer depolamaktır. Örneğin, bir renk listesinden geçen ve her rengin benzersiz bir değeri olan bir for döngüsüne sahip olabilirim. Listeden geçerken, sadece rengi, bir sözlükteki rengin eşsiz değerini değil, aynı zamanda listede kaç kez kırmızı renk olduğunu saklamak istiyorum.Sözlük koleksiyonunda veya başka türde koleksiyonda 2'den fazla öğe olabilir mi?

Aşağıdaki bildirimi koydum ve şimdi, değeri zaten içerip içermediğini görmek için nasıl test yapabileceğimi anlamak için yazıyorum ve yoksa 1 sayıyla listeye ekleyin ve eğer varsa , sayımı arttır. Bildiriyi yayınladıktan sonra, tek bir sözlükle nasıl yaptığımı yayınlayacağım.

Dictionary<string, int> colors = new Dictionary<string, int>(); 

foreach (Color color in ColorList) 
     { 
      if (colors.ContainsKey(color.ToString())) 
       colors[color]++; 
      else 
       colors.Add(color, 1); 
     } 
+0

yuvalama sözlük nesneler için öneriler geçiyoruz. Herkese açık üyelerle özel bir sınıf oluşturmanızı ve int türünde, MyCustomClass öğesinde bir sözlük nesnesi oluşturmanızı öneririz. –

cevap

4

belki renk ve gerçekleşme sayısıyla takip edecek bir yapının bir sözlük alabilir: İşte

Dictionary<string, Dictionary<int,int>> colors = 
          new Dictionary<string, Dictionary<int,int>>(); 

neden daha önce olayla ilgileniyordu kodu nedir?

Düzenleme: Başka bir yerde önerildiği gibi, bu kendi küçük özel sınıfınızı oluşturarak da yapılabilir. Esasen aynı şekilde çalışırdı.

+0

Sözlük gibi bir şey demek istiyorsunuz; – Xaisoft

+0

Sanırım bunu yapmak için başka bir yöntem. – TheTXI

3

Bunun için iki sözlük kullanabilirsiniz ya da sadece hem renk hem de sayıya sahip olan ve bir sınıftaki ara sınıf örneklerini saklayan bir veri sınıfı oluşturabilirsiniz.

+1

Bunu düşündüm. Yine de tuplleri merak ediyorum. – Xaisoft

+0

Tuples, onlarla çalışabilecek işlevsel bir kütüphaneye sahip olmadığınız sürece, sadece sizden şimdikileri (ara sınıf) yazmanızı sağlayacaktır. –

0

Bir MultiMap arıyorsunuz.

using System.Collections.Generic; 

public class MultiMapSet<TKey, TValue> 
{ 
    private readonly Dictionary<TKey, HashSet<TValue>> _ht = new Dictionary<TKey, HashSet<TValue>>(); 

    public void Add(TKey key, TValue value) 
    { 
     HashSet<TValue> valueSet; 
     if (_ht.TryGetValue(key, out valueSet)) 
     { 
      valueSet.Add(value); 
     } 
     else 
     { 
      valueSet = new HashSet<TValue> { value }; 
      _ht.Add(key, valueSet); 
     } 
    } 

    public bool HasValue(TKey key, TValue value) 
    { 
     HashSet<TValue> valueSet; 
     if (_ht.TryGetValue(key, out valueSet)) 
     { 
      return valueSet.Contains(value); 
     } 
     return false; 
    } 

    public HashSet<TValue> GetValues(TKey key) 
    { 
     HashSet<TValue> valueSet; 
     _ht.TryGetValue(key, out valueSet); 
     return valueSet; 
    } 

    public void Remove(TKey key, TValue value) 
    { 
     HashSet<TValue> valueSet; 
     if (!_ht.TryGetValue(key, out valueSet)) 
     { 
      return; 
     } 

     if (valueSet.Contains(value)) 
     { 
      valueSet.Remove(value); 
     } 
    } 
} 
+0

-1, bu sorunu çözerken, bu yanlış bir yaklaşımdır. Özellikle de kodu korumak söz konusu olduğunda. – Samuel

+0

@Samuel: Neden bu "yanlış yaklaşım"? Kod bakımının ötesinde nedenlerle böyle bir yorumu desteklemelisiniz - bakımı zorlaştıran bu çözüm hakkında ne var? –

+0

Sanırım, bilgimizin en iyisi için, OP'in kodunun 1 bölümünde çok özel bir kullanım durumu olduğunda yeni bir koleksiyonun tamamını tanımlamanızdır. –

1

Eh, tek yön için olurdu:

Dictionary<key, KeyValuePair<value, int>> 

Sorunuzu anlamak ediyorsam

I (tam olarak test değil) Aşağıdaki yazdı.


Düzenleme: renk ve değer tutarlı olsaydı

Aslında - 'kırmızı' hep 3 veya 19 ya da sen kırmızı, daha sonra ismin değeri 'kırmızı' ve olarak kullanılan her türlü anlam değeri, 19 demek, gerçekten sadece bir bileşik anahtar ve böylece böyle bir şey yapabileceğini:

Dictionary<KeyValuePair<string, int>, int> mydict; 

ve sonra güncellemeler için böyle bir şey yapmak:

mydict[key] = mydict[key] + 1; 
+0

Bu doğru görünüyor. Buna nasıl döneceğimi ve sayımı artıracağım ve kopyaları nasıl kontrol edeceğimin bir örneğini verebilir misiniz? – Xaisoft

+0

Evet, kırmızı ve kırmızı değeri sabit, değişecek tek şey sayımdır. – Xaisoft

6

Üçlü gibi basit bir Tuple sınıfı yapabilirsiniz. Aslında, genel olarak anahtarlanmış bir sözlük ama ek bir nesne tutar. Bu senaryo için oldukça yaygındır, insanlar 4 ila 10 nesne için genişleten kütüphaneler yapmışlardır.Bu yanıtlardan çoğu hepsi hemen hemen söylemek

-1

Eğer

Dictonary<string,string> dh = new dictonary<string,string>(); 

dh.add("x","Something:0"); 


foreach keyvaluepair kvp in dh 
{ 

    if kvp.key == x 
    { 
     string[] hold= kvp.value.split(':'); 
     //to update it the count it would be something like 

     int y = convert.toint(hold[1])+1; 
     kvp.value=hold[0]+":"+y.tostring(); 

    } 

} 
+1

-1: Üretimde asla böyle bir kod yazmayın. Tip güvenliğini atar, gülünç verimsiz ve kod okunamaz. – Juliet

+0

+1 benden. Kodlama/kod çözme aynı noktada yapıldığı sürece, bu şimdiye kadar gördüğüm en çılgın fikir değil. Bu, geçerli bir alternatiftir, yine de kullanmayacağım. –

0

gibi bir şey yapabileceğini,

var myTriple = new Triple<string, Color, int>(
         "key", 
         myColor, 
         count 
        ) 

: o zaman

public struct Triple<X, Y, Z> 
    { 
     public X First;  
     public Y Second;  
     public Z Third;  

     public Triple(X x, Y y, Z z) 
     { 
      First = x; 
      Second = y; 
      Third = z; 
     } 
    } 

Ve böylece gibi kullanmak: İşte bir örnek aynı (doğru) şey. 'Dış' sözlüğünüzün değerini, ihtiyacınız olan şeyi yapmak için en kullanışlı bulduğunuz bir nesne nesnesi yapın. Şahsen bunun hakkında düşünmeden sözlük sözlüğü ile giderdim. C# 4.0 beri

Dictionary<key1, Dictionary<key2, value>> 
+0

Aklımı da geçen ilk şey. İkinci sözlükte sayımı artırmak için bir kod örneği verebilir misiniz? – Xaisoft

+0

Bu gerçekten işe yaramıyor, sadece soruyu kısmen çözüyor. Bu yazıya güçlü bir şekilde yazılmış bir Renk ve Int32'yi depolamaya nasıl başlıyorsunuz? – Samuel

1

tanımlama grubu nesneleri oluşturmak için statik yöntemler rovides kayıt düzeni sınıfı yoktur.

bakınız: istediğin bu değil çünkü http://msdn.microsoft.com/en-us/library/system.tuple.aspx

// Create a 7-tuple. 
var population = new Tuple<string, int, int, int, int, int, int>(
          "New York", 7891957, 7781984, 
          7894862, 7071639, 7322564, 8008278); 
// Display the first and last elements. 
Console.WriteLine("Population of {0} in 2000: {1:N0}", 
        population.Item1, population.Item7); 
// The example displays the following output: 
//  Population of New York in 2000: 8,008,278 
//  Population of New York in 2000: 8,008,278 
İlgili konular