10

我想为某些条件编写检查,而不必使用 try/catch,并且我想避免出现 Index Out of Range 错误的可能性

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
 {                
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
       {
           // execute code here
       }
 }

所以我面临的问题是,在第二次检查中,我需要查看我是否有一个不为空的 Item。但是,如果我没有Element[1],我会得到 Index Out of Range 异常。问题是可能有 2 个元素,其中一个(或两者)可能有空对象数组。只有当项目字符串之一不为空时,才必须执行代码。

希望我解释得很好。在任何情况下,我该如何避免出现该异常?

4

6 回答 6

4

好吧,你需要一些更好的空检查和一些更谨慎的代码。

if (array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
{                
   if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
   {
       // execute code here
   }
}

是不能接受的。

首先,让我们进行空检查

if (array != null)
{
    if (array.Element != null)

为简单起见,您可以使用&&

if (array != null && array.Element != null)

然后,在那个 if 里面,我们使用一个 for 循环(因为你被困在数组上)并且 null 检查它

for (int i = 0; i < array.Element; ++i)
{
    if (array.Element[i] != null && array.Element[i].Object != null)
    {

然后,由于您有嵌套数组,我们再次循环。这称为嵌套循环,这通常是不好的做法,我会在一秒钟内向您展示为什么它会起作用。

for (int o = 0; o < array.Element[i].Object.length; ++o)
{
    if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item))
    {

现在,由于所有这些丑陋的嵌套循环,我们发现您的 Item 不为空。最重要的是,您可以访问此处的所有潜在值,并且可以根据需要对它们进行分组。以下是我如何将整个事情放在一起以简化。

List<string> arrayValues = new List<string>();
if (array != null && array.Element != null)
{
    for (int i = 0; i < array.Element.length; ++i)
    {
        //bool found = false;
        if (array.Element[i] != null && array.Element[i].Object != null)
        {
            for (int o = 0; o < array.Element[i].Object.length; ++o)
            {
                if (array.Element[i].Object[o] != null && !string.IsNullOrEmpty(array.Element[i].Object[o].Item))
                {
                    arrayValues.Add(array.Element[i].Object[o].Item);
                    //if you want to drop out here, you put a boolean in the bottom loop and break and then break out of the bottom loop if true
                    //found = true;
                     //break;
                }
            }
        }
        //if (found)
        //  break;
    }
}
if (arrayValues.Count > 0)
{
    //do stuff with arrayValues
}
于 2012-04-11T21:17:31.283 回答
0

你能做类似的事情:

if(array.Element[0] != null || array.Element[1] != null){
    //execute code
}
于 2012-04-11T20:50:41.397 回答
0

您的代码可能需要重构。

我认为它可以这样工作:

var obj = array.Element.FirstOrDefault(x => x.Object.Length > 0);
if (obj != null)
{
  if (obj.Object[0].Item.Length != 0) 
  {
    // do whatever is necessary
  }
}
于 2012-04-11T20:53:54.990 回答
0

使用短路将两个测试放在一起,&&以便在第一个测试失败时不会发生第二个测试:

object element0 = array.Element[0].Object;
object element1 = array.Element[1].Object;

// Ensure at least one Object array has a non-empty value.
if ((element0.Length > 0 && !string.IsNullOrEmpty((string)element0.Object[0].Item))
    || (element1.Length > 0 && !string.IsNullOrEmpty((string)element1.Object[1].Item)))
{
    // ...
}

我假设它Object[1]导致了异常——你并不清楚。如果是Element[1]导致异常(或两者兼有),那么您需要预先测试数组的长度:

if ((array.Element[0].Length != 0 && HasValue(array.Element[0].Object))
    || (array.Element[1].Length > 1 && HasValue(array.Element[1].Object)))
{
    // ...
}

// <summary>
// Returns true if the specified string array contains a non-empty value at
// the specified index.
// </summary>
private bool HasValue(System.Array array, int index)
{
    return array.Length > index && 
        !string.IsNullOrEmpty((string)array.Object[index].Item);
}
于 2012-04-11T21:00:43.583 回答
0

我认为你可以在你的第一个 if Check 之前签入。

if (array.Length > 1 && array.Element[0].Object.Length > 0 || array.Element[1].Object.Length > 0) //making sure there's at least one Object array that has values
 {                
    if (array.Element[0].Object[0].Item.Length != 0 || array.Element[1].Object[0].Item.Length != 0) //this is where I check that at least one of the Items (strings) is not empty
       {
           // execute code here
       }
 }

如果您的阵列没有两个元素,这应该只是短路。

于 2012-04-11T21:05:15.403 回答
0
for (long i = 0; i <= (output3.Length); i++)
{
    output1.WriteByte(output3[i]); -----> index out of range exception correct it
    output1.WriteByte(output3rx[i]);
}
于 2013-10-16T08:49:23.270 回答