使用循环时我得到了一个“'System.ArgumentOutOfRangeException'”?

时间:2015-04-20 03:26:47

标签: c# wpf html-agility-pack

var orth = node2.Descendants("span").ToList().FindAll(x => x.GetAttributeValue("class", "").Contains("orth"));
var type_translation = node2.Descendants("span").ToList().FindAll(x => x.GetAttributeValue("class", "").Contains("cit cit-type-translation"));

if (type_translation != null)
{
    for(int i=0;i<Math.Max(type_translation.Count(),orth.Count());i++)
    {
        if(orth.Count()!=0)
        {
            results.senselist += type_translation[i].InnerText.Trim() +
                                 " " + orth[i].InnerText.Trim() +"\n";
        }
        else
        {
            results.senselist += type_translation[i].InnerText.Trim() + " ";
        }
    }
}

调试器在orth[i].InnerText.Trim()播放时,应用程序崩溃。

EX:orth.count = 5 and type_translation.count = 7

正如我的代码:orth [6或7]将为null并在'System.ArgumentOutOfRangeException'显示错误orth[i],type_translation仍然有数据,但我不知道如何在null时检查它?帮我解决一下:

  • 如果“a”为null,则返回“”;

(=posséder)拥有,⇒Elle有2个小孩。她有两个孩子,她有两个孩子⇒Elle一个美女。她有一个可爱的房子。她有一个可爱的房子。 ⇒Ila le yeux bleus。他有蓝色的眼睛,他有蓝色的眼睛。 ⇒Tuas de beaux cheveux。你有漂亮的头发。你有漂亮的头发。 ⇒Ila beaucoup d'amis。他有很多朋友。他有很多朋友。

我没有足够的意义发布照片。抱歉。 https://social.msdn.microsoft.com/Forums/getfile/647259

2 个答案:

答案 0 :(得分:0)

你的循环条件是要求两个集合的最大数量 - i<Math.Max(type_translation.Count(),orth.Count()) - 所以如果一个比另一个短,那么你就会遇到问题。

您需要使用Math.Min或在每次访问阵列之前执行检查。

答案 1 :(得分:0)

这是破碎的:

for(int i=0;i<Math.Max(type_translation.Count(),orth.Count());i++)
{
    if(orth.Count()!=0)
    {
        results.senselist += type_translation[i].InnerText.Trim() + " " + orth[i].InnerText.Trim() +"\n";
        // ... 
    }
}

在脑海中经历这一切。 type_translation.Count > orth.Countorth.Count != 0会发生什么?同样,orth.Count > type_translation.Countorth.Count != 0会发生什么?你有一个IndexOutOfRangeException,因为你的逻辑是有缺陷的。

我无法真正告诉你在这里想要做什么,但这很麻烦。我的建议是弄清楚你的不变量是什么。这两个系列之间有什么关系?他们有不同的尺寸是否有意义?如果是这样,它是否允许大于另一个?同样,如果是这样,那么在索引之前,您需要确保i小于其中任何一个的计数。

现在真是一团糟。我建议您尽早维护不变量,以便清除此逻辑。