Удалить одно значение из коллекции NameValueCollection
Мой источник данных может иметь дубликаты ключей со значениями.
typeA : 1
typeB : 2
typeA : 11
Я решил использовать NameValueCollection
так как это позволяет вводить дубликаты ключей.
Я хочу удалить конкретную пару ключ / значение из коллекции, но NameValueCollection.Remove(key)
удаляет все значения, связанные с указанным ключом.
- Есть ли способ удалить одну пару ключ / значение из
NameValueCollection
, ИЛИ ЖЕ - Есть ли лучшая коллекция в 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
он выдаст исключение, так как ключ уже существует. Таким образом, вы можете ввести новый ключ, чтобы вставить эти данные.
Обратитесь к этому учебнику для получения дополнительной помощи.