c#如果字典中存在键仍然在字典中添加值

时间:2014-01-06 11:29:02

标签: c# linq dictionary

从数据表中我获取值并输入Dictionary<string,string>

Dictionary<string, string> mydic= new Dictionary<string, string>();

我的数据表是ex

Value     RowOrder    
page1       01 
page2       00
page3       00

我正在使用LINQ根据给定的值获取RowOrder并放入mydic

string id = (from DataRow dr in table3.Rows where (string)dr["Value"] == formula
             select (string)dr["RowOrder"]).FirstOrDefault();
mydic.Add(id,Value); 

如果我运行此错误,则显示错误:

  

“已添加具有相同键的项目。”

如何克服这一点。我希望page1page2page3分别添加值010000

5 个答案:

答案 0 :(得分:8)

在添加之前,您需要检查字典是否已有密钥:

if(!mydic.ContainsKey(id))
{
    mydic.Add(id, Value);
}

如果您希望使用不同的数据结构需要考虑重复的id值,则字典不能包含具有相同键的两个项目。

也许是List<Tuple<string, string>>

答案 1 :(得分:3)

在添加

之前检查密钥是否存在
if (mydic.ContainsKey(id))
    mydic[id] = Value; // or throw exception        
else
    mydic.Add(id, Value);

顺便说一句,如果您想将DataTable转换为Dictionary<string, string>,将 RowOrder 转换为关键,并将第一个(或最后一个) Value 转换为值,您可以使用LINQ:

var mydic = table3.AsEnumerable()
                  .GroupBy(r => r.Field<string>("RowOrder"))
                  .Select(g => g.First()) // or last to use last value for key
                  .ToDictionary(r => r.Field<string>("RowOrder"),
                                     r.Field<string>("Value"));

答案 2 :(得分:1)

您可以使用GroupBy,这是使用Linq-To-DataSet的单行方法:

Dictionary<string, string> mydic = table3.AsEnumerable()
    .GroupBy(row => row.Field<string>("Value"))
    .ToDictionary(grp => grp.Key, grp => grp.First().Field<string>("RowOrder"));

答案 3 :(得分:1)

使用

mydic[id] = Value;

而不是mydic.Add(); 如果要确保只插入一个具有给定键的项,则应使用Add方法。 请注意,这会覆盖以前写入的值。

如果您想要更多具有相同键的项目,您应该使用

Dictionary<string, IList<string>> 

或其他一些我不知道的数据结构,但我很高兴听到,因为我不止一次使用过那种字典

答案 4 :(得分:0)

您可以使用Lookup<string,string>

List<Tuple<string, string>> tuples = new List<Tuple<string, string>>();
tuples.Add(new Tuple<string, string>("01", "page1"));
tuples.Add(new Tuple<string, string>("00", "page2"));
tuples.Add(new Tuple<string, string>("00", "page3"));
var lookup = tuples.ToLookup(t => t.Item1,t=> t.Item2 );

您可以像以下一样使用它:

var result = lookup["00"];
foreach (var item in result)
{
    Console.WriteLine(item);
}

哪个输出:

page2
page3