从数据表中我获取值并输入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);
如果我运行此错误,则显示错误:
“已添加具有相同键的项目。”
如何克服这一点。我希望page1
,page2
,page3
分别添加值01
,00
,00
答案 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