2016-03-29 23 views
1

C# kodu:C# NameValueCollection ayrı değer

NameValueCollection nvc = new NameValueCollection(); 
nvc.Add("color", "red"); 
nvc.Add("size", "s"); 
nvc.Add("color", "red"); 
nvc.Add("size", "m"); 
nvc.Add("color", "red"); 
nvc.Add("size", "l"); 

//blue 
nvc.Add("color", "blue"); 
nvc.Add("size", "m"); 
nvc.Add("color", "blue"); 
nvc.Add("size", "l"); 
//green 
nvc.Add("color", "green"); 
nvc.Add("size", "s"); 
nvc.Add("color", "green"); 
nvc.Add("size", "m"); 
nvc.Add("color", "green"); 
nvc.Add("size", "l"); 

gerçek sonuç:

color:red,red,red,blue,blue,green,green,green 
size:s,m,l,m,l,s,m,l 

umut sonucu: sizin için

color:red,blue,green  
size:s,m,l 
+1

Example Çalışma

var results = nvc.AllKeys .GroupBy(g=>g) .Select(s=> new { key = s.Key, values = nvc.GetValues(s.Key).Distinct() }); foreach(var result in results) { Console.WriteLine("{0}- {1}", result.key, string.Join(",", result.values) ; } 

. herhangi bir kod yazdınız mı Eğer öyleyse. –

cevap

0

Kullanım durumunuzdan emin değilim, NameValueCollection, bu gibi durumlar için kopyaların Dictionary kullanımını daha iyi kullanmasına izin verir.

Yine de, istediğiniz sonuçları almak için NameValueCollection'da böyle bir şey yapabilirsiniz. Sen buna bir gitmek yaşadım göstermek gerekir

+0

Niçin kaç kopya olduğunu bilen ve sonra kopyaları daha sonra kaldırabilecek bir veri yapısını neden kullanacaksınız? Veri yapısının sizin için kopyalarla uğraşmasına izin vermek daha iyidir! – ErikE

+0

Bu doğru, ilk noktanın söylediği buydu. –

2

Bazı düşünceler:

  1. NameValueCollection, yinelenen değerlere izin verir. Bir Dictionary<string, string> kullanın.
  2. NameValueCollection sadece string, string için yazılmıştır eski bir nesnedir. Dictionary daha esnektir, çünkü tip parametrelerini belirtebilirsiniz.
  3. Dictionary kullanırken, aynı anahtarı iki kez eklemeye çalışırsanız hatalar alacağınızı unutmayın. Bu sözdizimini biraz değiştirerek giderilebilir. böcek sürünme izin biryere bir yol dizeleri kullanılarak, Tecrübelerime göre

    var myDict = new Dictionary<string, string>(); 
    myDict["color"] = "blue"; 
    myDict["color"] = "blue"; // no harm doing this twice 
    

ve hmmm, acaba (kolay hata yapma yapar: Yerine Add() arasında, sadece dizinleyici kullanmak Bunu biliyorum?). Bir şeyi yanlış yazmak çok kolay, ya da bir renge bir boyut atamak ya da tam tersini yapmak çok kolay.

Kodunuzdaki kavramları güçlü yazamayacağınızın bir nedeni var mı?

public abstract class ProductAttribute { } 

public sealed class Color : ProductAttribute { 
    private Color(string value) { Value = value; } 
    public Value { get; } 

    public static readonly Blue = new Color("blue"); 
    public static readonly Green = new Color("green"); 

    private static readonly IReadOnlyDictionary<string, Color> _colorDict = 
     new ReadOnlyDictionary<string, Color>(
      new List<Color> { 
      Blue, Green 
      }.ToDictionary(color => color.Value, color => color) 
     ); 

    public static Color GetColor(string value) { 
     Color color; 
     _colorDict.TryGetValue(value, out color); 
     return color; 
    } 
} 

Ardından, boyutlar için benzer bir şey yapın. Bu sadece bir fikir, belki de çok esnek değil (yeni değerler eklemek için kodu değiştirmeniz gerekir), ancak size neyin mümkün olduğunu göstermelidir.

Ama şimdi neler yapabileceğini bak: ProductAttribute sınıfları ile çalışmak

var attrs = new HashSet<ProductAttribute>; 
attrs.Add(Color.Blue); 
attrs.Add(Color.Green); 
attrs.Add(Color.Blue); // no problem 
attrs.Add(Color.GetColor("blue")); // no problem 
attrs.Add(Size.Small); 
attrs.Add(Size.Medium); 
attrs.Add(Size.Medium); // no problem 

Tek yön öylesine gibidir:

foreach (ProductAttribute attr in attrs) { 
    Color color = attr as Color; 
    if (color != null) { 
     // work with color 
    } 
} 

Alternatif olarak, olarak ekleyin, bir ProductAttributeType enum oluşturabilir ProductAttribute yapıcısında bir parametre ve ProductAttribute sınıfındaki salt okunur bir soyut özelliğe maruz bırakma. Daha sonra, tüm alt sınıflarınız ne tür olduklarını geçirir ve örneğin attr.ProductAttributeType == ProductAttributeType.Color'u yaptığınız bir şeyin türünü kolayca alabilirsiniz.

+0

'Sözlük 'ek olarak, bu dizin erişimcisi varolan değerin üzerine yazılırken bir çoğaltma eklenirken' Ekle' yönteminin istisna atacağını unutmayın. İstediğiniz gibi seçin. – ZoolWay

+0

@ZoolWay Bunu söylemeyi unutmuştum ama unutmuştum. Hatırlatma için teşekkürler. – ErikE

İlgili konular