如何从数组中找到子数组c#

时间:2014-10-31 06:29:32

标签: c#

我有以下字节数组。 byte[] subArray = { 0x00, 0x01, 0x00, 0x01 }; byte[] array = { 0x1A, 0x65, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x2B, 0x4C, 0xAA };

我想识别子阵列并将前面的字节加载到另一个字节数组中,即结果应如下所示。 byte[] result = {0x2B, 0x4C, 0xAA }

我想在子阵列之后加载所有内容。

任何帮助将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:2)

改编自我的other answer

byte[] subArray = { 0x00, 0x01, 0x00, 0x01 }; 
byte[] array = { 0x1A, 0x65, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x2B, 0x4C, 0xAA };

var matchIndexes =
    from index in Enumerable.Range(0, array.Length - subArray.Length + 1)
    where array.Skip(index).Take(subArray.Length).SequenceEqual(subArray)
    select (int?)index;

var matchIndex = matchIndexes.FirstOrDefault();
if (matchIndex != null)
{
    byte[] successor = array.Skip(matchIndex.Value + subArray.Length).ToArray();
    // handle successor here
}

答案 1 :(得分:0)

此问题描述了如何获取父数组中子数组的第一个索引。可以通过添加计数轻松修改以获取子数组的最后一个索引。从那里你可以使用LINQ Take和Skip或类似的数组操作函数。

Find the first occurrence/starting index of the sub-array in C#

答案 2 :(得分:0)

一种方法是执行以下操作

start from the first position 
 compare corresponding elements of array and sub array
  if there is a match 
    return the indexes as necessary and use the indexes to extract the result sets.
  else
    advance by 1 position
 repeat until you exhaust the whole main array

您可以使用此方法在主数组中提取多个子数组。

这是第一次削减。可能还有其他更有效的实现。

答案 3 :(得分:0)

试试这个。我没有测试这段代码,可能会有一些语法错误,即使不起作用,也要尝试理解算法。

    byte[] subArray = { 0x00, 0x01, 0x00, 0x01 }; 
    byte[] array = { 0x1A, 0x65, 0x3E, 0x00, 0x01, 0x00, 0x01, 0x2B, 0x4C, 0xAA };
    byte[] result;

    int lastLocation = -1;
    bool control = false;

    foreach(byte x in subArray)
    {
     if(array.contains(x))
     {
      if(location!=-1 || array.IndexOf(x) == lastLocation+1)
      {
       control = true;
       lastLocation = array.IndexOf(x);
      }
      else
      {
       control = false;
       lastLocation = -1;
      }
     }
     else
     {
     control = false;
     lastLocation = -1;
     }
    }
if(control)
{
Array.Copy(array,lastLocation,result,0);
}