我正在使用C#,我有一个名为intervalRecordsPerObject
的字典Dictionary<string, List<TimeInterval>>
。我需要遍历字典。问题是:每当我遍历字典时,可能会有更多KeyValuePairs
被添加到字典中。随着字典的增长,我也需要继续迭代新条目。
首先,我这样做了:一个简单的foreach
循环给了我一个InvalidOperationException
说
Collection was modified; enumeration operation may not execute.
我知道如果C#在ToList()
循环之前将其转换为foreach
,它就会以这种方式迭代字典。
我知道我可以将密钥复制到临时数组,使用简单的for
循环和Count
遍历字典,并且只要在字典中添加新条目,就将相应的密钥添加到字典中。阵列也是。现在,问题是一个简单的数组不能动态增长,我事先不知道所需的大小是多少。
为了继续前进,我想我会这样做:
List<string> keyList = new List<string>(intervalRecordsPerObject.Count);
intervalRecordsPerObject.Keys.CopyTo(keyList.ToArray(), 0);
我也不能这样做。 keyList
目前为空,因此keyList.toArray()
会返回一个长度为0的数组,这会给我一个ArgumentException
的说法
Destination array is not long enough to copy all the items in the collection. Check array index and length.
我被卡住了!知道我还能尝试什么?谢谢你的帮助。
字典存储特定对象所在的时间间隔。 Key是对象的ID。可能会在每次迭代中添加新条目(最坏情况),或者甚至可能不会添加一次。是否添加条目取决于几个条件(对象是否与其他一些间隔重叠等)。这会触发ID和相应间隔列表的更改,然后将其作为新条目添加到字典中。
答案 0 :(得分:1)
这样的事情:
List<string> keys = dict.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
var key = keys[i];
List<TimeInterval> value;
if (!dict.TryGetValue(key, out value))
{
continue;
}
dict.Add("NewKey", yourValue);
keys.Add("NewKey");
}
这里的诀窍是你通过索引枚举List<T>
!通过这种方式,即使您添加新元素,for (...)
也会“捕获”它们。
其他可能的解决方案,使用临时Dictionary<,>
:
// The main dictionary
var dict = new Dictionary<string, List<TimeInterval>>();
// The temporary dictionary where new keys are added
var next = new Dictionary<string, List<TimeInterval>>();
// current will contain dict or the various instances of next
// (multiple new Dictionary<string, List<TimeInterval>>(); can
// be created)
var current = dict;
while (true)
{
foreach (var kv in current)
{
// if necessary
List<TimeInterval> value = null;
// We add items only to next, that will be processed
// in the next while (true) cycle
next.Add("NewKey", value);
}
if (next.Count == 0)
{
// Nothing was added in this cycle, we have finished
break;
}
foreach (var kv in next)
{
dict.Add(kv.Key, kv.Value);
}
current = next;
next = new Dictionary<string, List<TimeInterval>>();
}
答案 1 :(得分:0)
您可以按位置而非按内容访问Keys
并使用正常For loop
(允许添加/删除而不受任何限制)。
for (int i = 0; i < dict.Keys.Count; i++)
{
string curKey = dict.Keys.ElementAt(i);
TimeInterval curVal = dict.Values.ElementAt(i);
//TimeInterval curVal = dict[curKey];
//Can add or remove entries
}