2016-04-11 26 views
1

değerleri almak bir sınıf var:kullanarak özel nesne gibi kilit Sözlük ama nesne özelliği

public class Foo 
{ 
    public string Name { get; set; } 
    public double Value { get; set; } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

Ve anahtar Foo nesnesi olan bir sözlük oluşturmak gerekir. Bunun gibi:

Foo foo1 = new Foo { Name = "Foo1", Value = 2.2 }; 
Foo foo2 = new Foo { Name = "Foo2", Value = 3.6 }; 

Dictionary<Foo, int> dic = new Dictionary<Foo, int>(); 
dic.Add(foo1, 1234); 
dic.Add(foo2, 2345); 

Ve şimdi Foo.Name özelliğini anahtar olarak geçirerek sözlükten değerler almak istiyorum. Bunun gibi:

int i=dic["Foo1"]; 
// i==1234 
i = dic["Foo2"]; 
// i==2345 

Mümkün mü? Veya Foo'nun nesnesini anahtar olarak ve Equides yöntemini geçersiz kılmak için tek yol mu?

+2

Anahtar olarak "Foo" ile bir değere bakmak için * ihtiyacınız var mı? Bunun yerine bir Sözlük 'kullanabilir misiniz? –

+0

Bu işe yaramaz. Sorun olarak, anahtar olarak Foo sınıfının bir örneğini kullandınız. Değeri almak için aynı örneği tekrar anahtar olarak kullanmanız gerekir. foo1.ToString() öğesini anahtar olarak kaydedin ve örneği dikte ettirmeyin; böylece dic ["Foo1"]; FYI bu bir sözlük

cevap

-1

Dictionary, bir hash tablosuna dayanmaktadır, yani bir şey arama yapmak için oldukça verimli bir algoritma olan karma arama kullanır. Ben senin tasarımına düşünmek ve sadece etrafında (değil tercih yolu kullanımı tasarımınızı değiştiremezsiniz yalnızca), bunu yapabileceği çalışmaların tümü key

olarak string kullanmak istiyorsanız sadece Dictionary<string,int> kullanmanızı öneririz.

var key = dic.Keys.FirstOrDefault(c=>c.Name == "Foo1");  

if(key != null) 
    dic[key]; // 
-1

Tamam. Bir sınıfın Dictionary'i miras almasını ve get değeri yöntemini geçersiz kılarak çözdüm. Bu benim sorunumu çözüyor, ancak büyük koleksiyonlarla üretkenlik konusunda emin değilim.

public class MyDictionary:Dictionary<Foo, int> 
{ 
    public Bar():base() 
    { 

    } 

    new public int this[string key] 
    { 
     get 
     { 
      return this[base.Keys.Single(a => a.Name == key)]; 
     } 
    } 
} 

Ve sonra bu kod iyi çalışıyor

:

MyDictionary<Foo, int> dic = new MyDictionary<Foo, int>(); 
    dic.Add(foo1, 1234); 
    dic.Add(foo2, 2345); 
    int i=dic["Foo1"]; 
2

bir anahtar olarak Foo kullanırsanız, siz de sözlük indeksine bir Foo kullanmanız gerekecektir.

using System.Collections.Generic; 

public class Foo { 
    public string Name { get; set; } 
    public double Value { get; set; } 

    public override string ToString() { 
     return Name; 
    } 
    public override int GetHashCode() { 
     return Name.GetHashCode(); 
    } 
    public override bool Equals(object obj) { 
     Foo other = obj as Foo; 
     if (other == null) { 
      return false; 
     } 
     return Name.Equals(other.Name); 
    } 
} 

class Program { 
    static void Main(string[] args) { 

     Foo foo1 = new Foo { Name = "Foo1", Value = 2.2 }; 
     Foo foo2 = new Foo { Name = "Foo2", Value = 3.6 }; 

     Dictionary<Foo, int> dic = new Dictionary<Foo, int>(); 
     dic.Add(foo1, 1234); 
     dic.Add(foo2, 2345); 

     int i = dic[new Foo { Name = "Foo1" }]; 

    } 
} 
+0

Teşekkür ederiz! + 1 Şerefe! – TonyMkenu

0

nasıl bu konuda:

aslında ne gerek büyük olasılıkla bir Dictionary<string, int>, size sadece adına göre Foo nesneleri karşılaştırabilirsiniz böylece GetHashCode ve Equals geçersiz kılma deneyebilirsiniz olması koşulu
class Program 
{ 
    public class Foo 
    { 
     public string Name { get; set; } 
     public double Value { get; set; } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 

    static void Main(string[] args) 
    { 
     Foo foo1 = new Foo { Name = "Foo1", Value = 2.2 }; 
     Foo foo2 = new Foo { Name = "Foo2", Value = 3.6 }; 

     var dic = new Dictionary<string, KeyValuePair<Foo, int>>(); 
     dic.Add(foo1.Name, new KeyValuePair<Foo, int>(foo1, 1234)); 
     dic.Add(foo2.Name, new KeyValuePair<Foo, int>(foo2, 2345)); 

     int x = dic["Foo1"].Value; 

     var y = dic["Foo2"].Value; 

     Console.WriteLine(x); 
     Console.WriteLine(y); 

     Console.ReadKey(); 
    } 
} 

Sonucu olacaktır: