Проблема дублирования предметов - PullRequest
1 голос
/ 05 августа 2010

Моя цель - добавить новое значение вставки в столбец, значения моего столбца которого следующие:

100 * 100
150 * 150
200 * 200
200 * 200

Я получаю следующую ошибку:

Товар уже добавлен. Ключ в словаре: '200 x 200' Добавляемый ключ: '200 x 200'

Для следующего кода:

SortedList sortedList = new SortedList();

foreach (ListItem listItem in ddldimension.Items)
    sortedList.Add(listItem.Text, listItem.Value);

if (!sortedList.ContainsKey(CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension1")))
    sortedList.Add(CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension1"), "defaultEmbedDimension1");

if (!sortedList.ContainsKey(CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension2")))
    sortedList.Add(CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension2"), "defaultEmbedDimension2");

if (!sortedList.ContainsKey(CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension3")))
    sortedList.Add(CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension3"), "defaultEmbedDimension3");

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

SortedList не позволяет добавлять дубликаты ключей. Вместо этого используйте List<> (вместе с KeyValuePair) (например, List<KeyValuePair<string, object>>).

Вот решение для вашего кода:

var list = new List<KeyValuePair<string, string>>();

foreach (var item in ddldimension.Items)
{
 list.Add(new KeyValuePair<string, string>(item.Text, item.Value));
}

var defaultEmbedDimension1 = CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension1");
int index = list.FindIndex(k => k.Key == defaultEmbedDimension1); // If there is no such Key, it will be -1. If you want to find by Value, replace k.Key by k.Value
if (index >= 0)
{
 list.Add(new KeyValuePair<string, string>(defaultEmbedDimension1, "defaultEmbedDimension1"));
}

Таким образом, вы позволяете сохранить дубликаты ключей в вашей структуре. Обратите внимание, что вы вызываете один и тот же метод дважды. Вместо этого инициализируйте переменную:

string defaultEmbedDimension1 = CommonUtilities.GetCustomString("DefaultValues", "defaultEmbedDimension1");

Чтобы заполнить список, вы также можете использовать LINQ:

var list = ddldimensions.Items.Select(item => new KeyValuePair<string, string>(item.Text, item.Value)).ToList();

Читайте также: Советы по сбору ключей C # KeyValuePair в Dot Net Perls.

Но если вы решите запретить дубликаты и аккуратно обработать их в SortedList, вы можете создать расширение:

public static class SortedListExtensions
{
 public static bool AddIfNotContains<K, V>(this IDictionary<K, V> dictionary, K key, V value)
 {
  if (!dictionary.ContainsKey(key))
  {
   dictionary.Add(key, value);
   return true;
  }
  return false;
 }
}

И используйте его, как я делал ниже, без исключения:

var sortedList = new SortedList<string, string>();
sortedList.Add("a", "b");
sortedList.AddIfNotContains("a", "b"); // Will not be added
sortedList.AddIfNotContains("b", "b"); // Will be added
2 голосов
/ 05 августа 2010

Из полученного сообщения об ошибке и из документации для SortedList :

В любом случае SortedList не допускает дублирование ключей.

Таким образом, может показаться, что SortedList не является подходящей структурой для использования в вашем приложении.К сожалению, вы предоставили недостаточно информации, чтобы я мог предложить что-то лучшее.

...