如何在c#中获取2D数组的长度? lenght和GetLength没有帮助

时间:2016-09-06 11:17:18

标签: c# arrays

这是我的代码。我想从我的2D数组中删除一些元素。因为我已经运行了一个for循环。但不知道如何绑定循环,因为它一直给我错误“索引超出数组的范围”(如果我使用长度/ GetLength)。 :

  int len1 = tagged_data.GetLength(0);
  int len2 = tagged_data.GetLength(1);
  int len = len1 + len2;
  Console.WriteLine(len); 
  for (int i = 0; i <= len1;i++ )
   {

                    if (tagged_data[i, 1] != "'NN'")//|| tagged_data[i, 1] != "'NNS'"|| tagged_data[i, 1] != "'VBD'" || tagged_data[i, 1] != "'VBG'" || tagged_data[i, 1] != "'VB'" || tagged_data[i, 1] != "'VBZ'")
                    {
                        tagged_data[i, 1] = null;

                    }
                    else if (tagged_data[i, 1] != "'NNS'")
                    {
                        tagged_data[i, 1] = "";

                    }
                    else if (tagged_data[i, 1] != "'VBD'")
                    {
                        tagged_data[i, 1] = "";

                    }
                    else if (tagged_data[i, 1] != "'VBG'")
                    {
                        tagged_data[i, 1] = "";

                    }
                    else if (tagged_data[i, 1] != "'VBZ'")
                    {
                        tagged_data[i, 1] = "";

                    }
                    else if (tagged_data[i, 1] != "'VB'")
                    {
                        tagged_data[i, 1] = "";

                    }
                    else
                        Console.Write("nothing to eliminate");
                }

4 个答案:

答案 0 :(得分:1)

你得到的错误太多了:

  • 错误尺寸len = len1 * len2*而不是+; 7 x 3数组包含7 * 3 == 21个项目
  • 错误的索引for (int i = 0; i < len1; i++),而不是i <= len1
  • 错误if 逻辑:您当前的实施会将所有 [i, 1]项设置为null

Sonething喜欢这样(消除标签):

String[,] tagged_data = ...

...   

Console.WriteLine(tagged_data.Length);

HashSet<String> tagsToRemove = new HashSet<String>() {
  "'NN'", "'NNS'", "'VBD'", "'VBG'", "'VBZ'", "'VB'",  
};

for (int i = 0; i < tagged_data.GetLength(0); ++i)
  if (tagsToRemove.Contains(tagged_data[i, 1]))
    tagged_data[i, 1] = null;
  else 
    Console.Write("nothing to eliminate");  

如果您想保留标签:

Console.WriteLine(tagged_data.Length);

HashSet<String> tagsToPreserve = new HashSet<String>() {
  "'NN'", "'NNS'", "'VBD'", "'VBG'", "'VBZ'", "'VB'",  
};

for (int i = 0; i < tagged_data.GetLength(0); ++i)
  if (!tagsToPreserve.Contains(tagged_data[i, 1]))
    tagged_data[i, 1] = null;
  else 
    Console.Write("nothing to eliminate");  

答案 1 :(得分:0)

For循环应该是

for (int i = 0; i < len1;i++ )

因为长度给出的总大小和索引从零开始。所以最后一个索引将是总长度 - 1。

e.g。

int[] a = {1,2,3,4}的长度为4,但索引为3。

答案 2 :(得分:0)

尝试将for (int i = 0; i <= len1;i++ )
替换为for (int i = 0; i < len1; i++)

这背后的原因是Length从1开始计数到总长度,但是数组的索引从0开始,因此如果你试图访问数组[len1],你会得到这个异常。

答案 3 :(得分:0)

正确的循环应该是:

for(int i = 0; i < len1; i++)

要迭代一个数组,你需要执行从0开始到(arrayLength - 1)的循环,因为数组索引从0开始并转到(arrayLength - 1)

考虑这个数组:

int a[] = {1, 2, 3, 4, 5}; //Length: 5, Index range: 0 - 4

在上面的示例中,值存储为:

  • 1指数0
  • 2指数1
  • 3 at index 2
  • 4 at index 3
  • 5 at index 4

因此,在这种情况下,循环将从0执行到4,这比数组的长度小1。