2013-05-17 36 views
4

我的數據源可能具有重複鍵值。從NameValueCollection刪除單個值

typeA : 1 

typeB : 2 

typeA : 11 

我選擇使用NameValueCollection,因爲它可以輸入重複密鑰。

我想從集合中移除特定的鍵\值對,但是NameValueCollection.Remove(key)刪除了與指定鍵相關的所有值。

  1. 有沒有辦法從NameValueCollection, 或
  2. 刪除單個鍵\值對是否有在C#中更好地收集適合我的數據

[編輯1]

首先,感謝所有的答案:)

我想我應該提到臨屋區我的數據源是XML。

我用System.Xml.Linq.XDocument查詢類型,也很方便刪除一個特定的值。

現在,我的問題是,對於大型數據,考慮到性能,使用XDocument是一個很好的選擇? 如果沒有什麼其他選擇(也許回NameValueCollection中使用的提及刪除數據的技術之一)

+0

都能跟得上我認爲它不會與元素的索引工作,也許你需要嘗試出其他方式 –

+0

嘗試詞典。 –

+2

嘗試'列表>' –

回答

-1

您可以使用,而不是字典集合:

Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
dictionary.Add("typeA", 1); 
dictionary.Add("typeB", 1); 

當您嘗試插入type: 11它會拋出異常,因爲Key已經存在。所以你可以輸入一個新的密鑰來插入這些數據。

請參閱此Tutorial以獲得進一步的幫助。

0

你可以將其轉換爲哈希表

  var x = new NameValueCollection(); 
      x.Add("a", "1"); 
      x.Add("b", "2"); 
      x.Add("a", "1"); 
      var y = x.AllKeys.ToDictionary(k => k, k=>x[k]); 
+1

字典將包含值[「a」,「1,1」]和[「b」,「2」]。這可能不是艾曼之後的事情。 – user707727

0

使自己的方法,我的作品 -

public static void Remove<TKey,TValue>(
    this List<KeyValuePair<TKey,TValue>> list, 
    TKey key, 
    TValue value) { 
    return list.Remove(new KeyValuePair<TKey,TValue>(key,value)); 
} 

然後調用它的列表作爲 -

list.Remove(key,value); //Pass the key value... 
+0

此解決方案僅在「EqualityComparer .Default」和「EqualityComparer .Default」產生正確結果時纔有效。 –

2

用相同的鍵存儲多個值的想法是奇怪的。但我認爲您可以使用GetValues檢索所有值,然後刪除不需要的值,然後使用Set和隨後的Add方法將其返回。您可以爲此創建一個單獨的擴展方法方法。

0

也許不是最好的方式,但是....

public class SingleType 
{ 
    public string Name; 
    public int Value; 
} 

List<SingleType> typeList = new List<SingleType>(); 
typeList.Add (new SingleType { Name = "TypeA", Value = 1 }); 
typeList.Add (new SingleType { Name = "TypeA", Value = 3 }); 

typeList.Remove (typeList.Where (t => t.Name == "TypeA" && t.Value == 1).Single()); 
+0

如果列表中沒有一個元素,Single()會拋出異常。這應該是好的:'var val = typeList.Where(t => t.Name ==「TypeA」&& t.Value == 1).SingleOrDefault(); if(val!= null)typeList.Remove(val);' –

+0

是的,對不起,應該提到這一點 - 只是非常快速地將代碼敲在一起....但是拋出(捕獲)異常可能在這裏很方便,試圖刪除無效數據IMO。 – Andrew

+0

是的,這取決於用戶是否認爲「試圖刪除無效數據」_exceptional_ –

1

NameValueCollection並沒有真正允許有相同的密鑰多個條目。它只是將現有密鑰的新值連接成逗號分隔的值列表(請參閱NameValueCollection.Add

因此,每個密鑰確實只有一個值。你可以想象得到的價值將他們分開','並刪除違規價值。

Edit: @ElDog is correct, there is a GetValues method which does this for you so no need to split.

一個更好的選擇,我認爲是使用Dictionary<string, IList<int>>Dictionary<string, ISet<int>>存儲值離散呃,值