2010-08-05 70 views
1

我的目标是一个插入新值添加到列在我的列值如下项目重复问题

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

我收到以下错误:

Item has already been added. Key in dictionary: '200 x 200' Key being added: '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

从您收到的错误消息以及SortedList的文档:

In either case, a SortedList does not allow duplicate keys.

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

+0

谢谢4 d答复达米恩 – GethuJohn 2010-08-05 09:43:10

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

阅读也:C# KeyValuePair Collection Hints在斑点网皮尔斯。

但是,如果你决定要禁止复制,并在排序列表与他们轻轻的处理,您可以创建一个扩展:

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 
+0

感谢您的答复...但你能解释什么所有的修改可以用当前代码完成? – GethuJohn 2010-08-05 07:23:10

+0

我刚才解释过。那是你需要的吗? – 2010-08-05 16:04:01