Удалить одно значение из коллекции NameValueCollection

Мой источник данных может иметь дубликаты ключей со значениями.

typeA : 1

typeB : 2

typeA : 11

Я решил использовать NameValueCollection так как это позволяет вводить дубликаты ключей.

Я хочу удалить конкретную пару ключ / значение из коллекции, но NameValueCollection.Remove(key) удаляет все значения, связанные с указанным ключом.

  1. Есть ли способ удалить одну пару ключ / значение из NameValueCollection, ИЛИ ЖЕ
  2. Есть ли лучшая коллекция в C#, которая соответствует моим данным

[РЕДАКТИРОВАТЬ 1]

Во-первых, спасибо за все ответы:)

Я думаю, что я должен был упомянуть, что мой источник данных - XML.

я использовал System.Xml.Linq.XDocument запросить тип, а также было удобно удалить определенное значение.

Теперь мой вопрос: для больших объемов данных использование XDocument - хороший выбор, учитывая производительность? Если нет, то каковы другие альтернативы (может быть, вернуться к NameValueCollection и использовать один из методов, упомянутых для удаления данных)

6 ответов

Идея хранения нескольких значений с одним и тем же ключом несколько странна. Но я думаю, что вы можете извлечь все значения, используя GetValues, затем удалить то, что вам не нужно, и вернуть их обратно с помощью Set, а затем последующие методы Add. Вы можете сделать отдельный метод метода расширения для этого.

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>> хранить значения как дискретные значения, значения

Возможно, не лучшим образом, но....

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

Сделай свой собственный метод, он работает для меня -

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...

Вы можете преобразовать его в Hashtable

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

Вместо этого вы можете использовать словарь:

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

При попытке вставить type: 11 он выдаст исключение, так как ключ уже существует. Таким образом, вы можете ввести новый ключ, чтобы вставить эти данные.

Обратитесь к этому учебнику для получения дополнительной помощи.

Другие вопросы по тегам