我正在处理某些事情,我需要从数据库中获取一些值并将其声明为DataTable.
I have this a
KeyValuePair`列表
List<KeyValuePair<int, int>> thisList = new List<KeyValuePair<int, int>>();
thisList
的密钥从1到31(实际上是几天)循环,而默认情况下,下面的循环将值设置为0。 (实际上价值是一些东西)
for (int i = 1; i <= 31; i++)
{
thisList.Add(new KeyValuePair<int, int>(i, 0));
}
我在其他地方使用此列表来存储DataTable
中行的值。
虽然这对DataTable中的第一行正常工作,但添加一行时,thisList
中的值将被聚合而不是替换。我在这里使用这个循环:
DataTable table;
//columns set somewhere here... not the issue in focus
foreach(var value in aBigListOfThings)
{
for (int i = 0; i < thisList.Count(); i++)
{
if (condition)
{
int sumtemp = 0;
int.TryParse(someVariable.FirstOrDefault().someValue, out temp);
temp += thisList[i].Value;
// ====Possibly the issue
thisList[i] = new KeyValuePair<int, int>(unrelatedValue, sumtemp);
//=====
}
}
//==== attempt the reset the value in the keyvaluepair to 0
if (someothercondition)
{
for (int i = 1; i <= 31; i++)
{
thisList[i] = new KeyValuePair<int, int>(i, 0);
}
}
}
在我添加修复程序以将值重置为0(if (someothercondition)
)之前,数据看起来像这样:
1 | 2 | 3 | 4 | 5 | ...... 31 <---key
------------------------------
2 | 4 | 6 | 8 | 10 | ...... n <---value
3 | 7 | 11 | 15 | 19 | ...... n <---value
虽然它应该看起来像这样
1 | 2 | 3 | 4 | 5 | ...... 31 <---key
------------------------------
2 | 4 | 6 | 8 | 10 | ...... n <---value
1 | 3 | 5 | 7 | 9 | ...... n <---value
根据我的理解和寻找解决方案,KeyValuePair
是不可变的,如果有任何不能添加的内容(例如+=
中,但可以替换..(如果我是&#39;请更正我我错了)
当我使用修复程序(上面的wayyyy)时,我得到一个超出范围异常的索引。 Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
我的意思是thisList[i] = new KeyValuePair<int, int>(i, 0);
在列表中添加更多内容而不是替换现有内容。
......如果你还在阅读这个......我的问题是
a)为什么KeyValuePair
在汇总值时被认为是不可变的?
b)我怎样才能简单地将keyvaluepair
中的值替换为0而不是?或者有可能吗?
在这一点上任何帮助都会非常有用..一直在破坏我的头脑。 :|
答案 0 :(得分:1)
List<T>
的起始索引为0,而不是1.这意味着您的上一个循环需要如下所示:
for (int i = 0; i < 31; i++)
{
thisList[i] = new KeyValuePair<int, int>(i, 0);
}
这将替换索引0到30中的31 KeyValuePair
。
顺便说一下,为什么你没有像上一个那样创建循环,这有效吗?
答案 1 :(得分:0)
为什么不接受它并设定价值?例如
Dictionary<string, int> list = new Dictionary<string, int>();
list["test"] = 1;
list["test"] += 1;
Console.WriteLine (list["test"]); // will print 2