C#通过数组掩码获取数组的一部分

时间:2016-11-28 12:55:03

标签: c# arrays

请帮帮我。我想通过掩码数组获取数组的一部分。 这是我的代码:

byte[] source = new byte[] {97, 98, 99, 5, 15, 66, 77, 102, 0, 102, 0, 102, 0, 102, 0, 102, 0};
byte[] mask = new byte[] { 102, 0, 102, 0, 102, 0, 102, 0 };
byte[] result = EscapeArray(0, source, mask); 
private byte[] EscapeArray(int startIndex, byte[] source, byte[]mask)
{
   ???
}

EscapeArray方法的输出将是97,98,99,5,15,66,77。 源数组有任何值,但某处是掩码序列。 EscapeArray从startIndex返回数组的一部分到掩码的开始。 我需要非常快速的算法,因为这种方法将经常进行。 感谢

2 个答案:

答案 0 :(得分:1)

我们走了。这是根据您删除的评论构建的。

public static void Main()
{       
    int[] arr = new int[] { 1, 2, 3, 4, 5, 0, 0, 0, 0, 7, 8, 9};
    int[] mask = new int[] { 0, 0, 0, 0 };

    // Usage
    var subArr = SubArrayTillMask(2, arr, mask);

    Console.WriteLine(String.Join(",",subArr));
}


static int[] SubArrayTillMask(int start, int[] array, int[] mask ) 
{
    var foundPos = -1;

    var len = mask.Length;
    var limit = array.Length - len;
    for( var i = 0;  i <= limit;  i++ ) 
    {
        var k = 0;
        for( ;  k < len;  k++ ) {
            if( mask[k] != array[i+k] ) break;
        }
        if( k == len ) foundPos = i;
    }
    if(foundPos == -1)
        return array;

    return array.Skip(start).Take(foundPos-start).ToArray();
}

示例:.Net Fiddle
性能测试:.Net Fiddle

结果:在0.018965秒内测试了10000行。

致谢:Find an array (byte[]) inside another array?

答案 1 :(得分:1)

我建议找到第一个掩码发生的索引:

private static int MaskIndex(byte[] source, byte[] mask) {
  if (mask.Length == 0)
    return 0; // or source.Length; or throw exception

  for (int i = 0; i < source.Length - mask.Length + 1; ++i) {
    bool found = true;

    for (int j = 0; j < mask.Length; ++j)
      if (source[i + j] != mask[j]) {
        found = false;

        break;
      }

    if (found)
      return i;
  }

  return source.Length;
}

有了这个,您可以将EscapeArray实现为

private byte[] EscapeArray(int startIndex, byte[] source, byte[] mask) {
  int n = MaskIndex(source, mask);

  if (startIndex > n)
    return new byte[0]; // or throw exception 

  return source.Skip(startIndex).Take(n - startIndex).ToArray();
}

测试:

byte[] source = new byte[] 
  { 97, 98, 99, 5, 15, 66, 77, 102, 0, 102, 0, 102, 0, 102, 0, 102, 0 };
byte[] mask = new byte[] 
  { 102, 0, 102, 0, 102, 0, 102, 0 };

// 97, 98, 99, 5, 15, 66, 77  
Console.WriteLine(string.Join(", ", EscapeArray(0, source, mask)));

// 97, 98, 99, 5, 15, 66, 77, 102, 0, 102, 0, 102, 0, 102, 0, 102, 0
Console.WriteLine(string.Join(", ", EscapeArray(0, source, new byte[] {123})));