【问题标题】:splitting array of byte with subarray using c# LINQ使用 c# LINQ 将字节数组与子数组拆分
【发布时间】:2012-07-05 23:51:27
【问题描述】:

我遇到了更进一步的问题:

我有一个类似 {0xNN, 0xNN, 0xNN, 0xNN, 0xFF, 0xFF, 0xNN, 0xNN, 0xFF, 0xFF} 的数组,其中 {0xFF, 0xFF} 是一个分隔符。

是否可以使用 LINQ 获得类似 {{0xNN, 0xNN, 0xNN, 0xNN} , {0xNN, 0xNN}} 的枚举?

【问题讨论】:

  • How to split a byte array 的可能重复项
  • @Mike 那 q 正在谈论一种子字符串,而不是拆分。
  • @Mike 看不到 LINQ 或任何其他类型的 lambdas。
  • @IceCroft:如果您的问题只是“有可能”,那么答案是肯定的。也许您应该显示一些代码或上下文,以便我们理解为什么这仅限于“LINQ”(或者请描述您认为 LINQ 是什么,因为 LINQ 与 lambda 方法无关)。
  • @sixlettervariables 同意,ofc 仅使用 linq 是可能的,但是很难避免大量无意义的重复。

标签: c# arrays linq indexing split


【解决方案1】:

你可以写一个这样的扩展,用任意长度的分隔符一次性完成这项工作。

public static class Extensions
{
    public static IEnumerable<IEnumerable<T>> Split<T>(
        this IEnumerable<T> source,
        IEnumerable<T> delimiter)
    {
       var delimiterList = delimiter.ToList();
       var outputBuffer = new List<T>();
       var m = 0;

       foreach(var item in source)
       {
           if item.Equals(delimiterList[m])
           {
               m++;

               if(m == delimiterList.Count)
               {
                  m = 0;

                  if (outputBuffer.Count > 0)
                  {
                      yield return outputBuffer;
                      outputBuffer = new List<T>();
                  }
               }
           }
           else
           {
               outputBuffer.AddRange(delimiterList.Take(m));

               if (item.Equals(delimiterList[0]))
               {
                   m = 1;
               }
               else
               {
                   m = 0;
                   outputBuffer.Add(item);
               }
           }              
       }

       outputBuffer.AddRange(delimiterList.Take(m)); 

       if (outputBuffer.Count > 0)
       {
           yield return outputBuffer;
       }
   }
}

你可以这样使用。

var joinedBytes = new byte[] { ... }
var delimiter = new byte[] { 0xFF, 0xFF }

var splitBytes = joinedBytes.Split(delimiter);

【讨论】:

  • @Akli,另一个被拒绝的好修复。我已将您的建议与轻微的调整整合在一起。
【解决方案2】:

我认为你不能在 LINQ 中做到这一点,因为你的分隔符是由集合的两个元素定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多