【发布时间】:2014-12-18 13:21:15
【问题描述】:
我有一个让我发疯的问题。我正在使用一个通用列表,每当我尝试将其第一个(或最后一个?)索引分配给一个变量时,它就会抛出一个 ArgumentOutOfRangeException。这是一大堆代码,因此我将尝试仅提取相关内容。所以这里是:
private string GetRuleByName(string name, List<string> rules)
{
if(rules != null)
{
List<string> todo = new List<string>();
todo.AddRange(rules);
while(rules.Count != 0)
{
string r = todo[0]; // <- Error 'ArgumentOutOfRangeException' here
todo.RemoveAt(0);
// ...
}
}
}
这就是我调用方法的方式:
void treeView_AfterSelect(object sender, TreeViewEventArgs e)
{
string currentRule = GetRuleByName(treeView.SelectedNode.FullPath, ruleCollection)
// the string list "ruleCollection" always contains
// strings and thus is never empty
}
尽管这不是对正在发生的事情的非常详细的介绍,因为我不得不截取一段复杂的代码,但我真的希望其他人能看到导致错误的原因。
非常感谢您至少看一下!
编辑:
这就是方法的样子。我没有改变任何东西,以展示它的真实内容。我希望这对某人有意义:
private Rule GetRuleByNameOrId(string stName, List<Rule> rules)
{
if(rules != null)
{
string searchName = stName.ToLower().Trim();
string subName = "";
int slashPos = searchName.IndexOf('/');
if(slashPos != -1)
{
if(slashPos != searchName.Length)
subName = searchName.Substring(slashPos + 1);
searchName = searchName.Substring(0, slashPos);
}
List<Rule> todo = new List<Rule>();
todo.AddRange(rules);
while(todo.Count != 0)
{
Rule r = (Rule)todo[0];
todo.RemoveAt(0);
if(r.Name.ToLower() == searchName || r.Id.ToLower() == searchName)
{
if(subName != "")
{
Rule subRule = GetRuleByNameOrId(subName, r.Children);
if(subRule != null)
return subRule;
}
else
{
return r;
}
}
if(r.Children != null && r.Children.Count != 0)
todo.AddRange(r.Children);
}//end while
}//end if(rules != null)
return null;
}
【问题讨论】:
-
您在
rules.Count != 0时循环,但您使用todo.RemoveAt(0)从待办事项中删除项目 - 因此您在待办事项中用完了项目并且索引超出范围,因为rules.Count始终 > 0。你的意思是改用while(todo.Count != 0)? -
todo是一个空列表 - 它没有第 0 个元素 -
todo不是空 Preston - 在循环之前有一个todo.AddRange调用,并且由于 OP 说rules永远不会为空,我们必须查看代码以查看todo的索引可能超出范围 -
你能解释一下从待办事项列表中删除项目的逻辑吗?琐碎循环错误的一部分可能有更好的方法来准备待办事项列表,知道所需的逻辑。在不知道省略的代码的情况下,您的待办事项列表将在循环结束时完全为空,那么为什么要首先在其中添加元素呢?
-
@Steve 我知道不可能看到发生了什么。正如我在问题中所说,进行有意义的剪辑并不容易,因为代码非常复杂。不过我还是会试一试的。
标签: c# list indexing argumentexception