项目重复问题

时间:2010-08-05 06:54:37

标签: c# duplicates sortedlist

我的目标是将一个插入新值添加到我的列值如下的列

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 个答案:

答案 0 :(得分:2)

来自您收到的错误消息,以及SortedList的文档:

  

在任何一种情况下,SortedList都不允许重复键。

因此,看起来SortedList不是您在应用程序中使用的正确结构。不幸的是,您提供的信息不足以让我提出更好的建议。

答案 1 :(得分:2)

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

另请阅读:Dot Net Perls的C# KeyValuePair Collection Hints

但是如果你决定禁止重复并在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