2016-03-29 26 views
1

C#如下代碼:C#的NameValueCollection不同的值

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"); 

實際結果:

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

希望的結果:

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

你需要證明你有這個一展身手。你有沒有寫過任何代碼?如果是這樣發佈。 –

回答

0

我不確定您的使用案例,NameValueCollection允許重複使用Dictionary這樣的案例更好。

你仍然可以在NameValueCollection上做這樣的事情來獲得你想要的結果。

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) ; 
} 

工作Example

+0

爲什麼你會使用一個數據結構,可能會膨脹誰知道有多少重複,然後刪除重複?最好讓數據結構爲你處理重複數據! – ErikE

+0

這是正確的,這是我的第一點說的。 –

2

一些想法給你:

  1. NameValueCollection允許重複的值。使用Dictionary<string, string>
  2. NameValueCollection是一個較舊的對象,只強制輸入到string, stringDictionary更靈活,因爲您可以指定類型參數。
  3. 使用Dictionary時請注意,如果您嘗試添加兩次相同的密鑰,將會出現錯誤。這可以通過稍微改變你的語法來彌補。取而代之的Add(),只需使用索引:

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

根據我的經驗,使用字符串所有的地方是一個方法,讓蟲子爬在,而且很容易出錯(嗯,不知道如何我知道這個?)。拼寫錯誤很容易,或者將大小分配給顏色,反之亦然。

有沒有理由不能在你的代碼中強調類型的概念?

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; 
    } 
} 

然後做一些類似的大小。這只是一個想法,可能不是很靈活(你必須改變代碼來添加新的值),但它應該告訴你什麼是可能的。

不過看你現在可以做什麼:

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 

一種方式與ProductAttribute類的工作就像這樣:

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

或者,你可以創建一個ProductAttributeType枚舉,其添加爲ProductAttribute構造函數中的參數,並將其公開在ProductAttribute類中的只讀抽象屬性中。然後,所有的小類都會以什麼類型傳遞,例如,您可以很容易地獲得某種類型的東西,例如attr.ProductAttributeType == ProductAttributeType.Color

+0

除'Dictionary '外,'Add'方法在添加重複項時會引發異常,而此索引訪問器只會覆蓋現有值。選擇你喜歡的。 – ZoolWay

+0

@ZoolWay我本來打算提一下,但忘了。感謝您的提醒。 – ErikE