【问题标题】:search in bit array in c#在 C# 中的位数组中搜索
【发布时间】:2013-12-26 04:00:56
【问题描述】:

如果有两个数组,第一个数组大小为 100 位,第二个数组大小为 32 位,我想在第一个数组 100 位中搜索 32 位数组

BitArray bits = new BitArray(100);  
BitArray bitss = new BitArray(32); 


bitss.Set(16,true);
bitss.Set(25,true);
bitss.Set(26,true);
bitss.Set(28,true);
bitss.Set(29,true);
bitss.Set(31,true);

for (int i = 0; i < (bits.Length)-1;i++ )

if ((bits[i] == bitss[0] &&
    bits[i + 1] == bitss[1] &&
    bits[i + 2] == bitss[2] &&
    bits[i + 3] == bitss[3] &&
    ...
    bits[i + 31] == bitss[31]))

    Console.WriteLine("Found");

有没有更好的方法在 C# 中不使用( if 和 == )在位数组中搜索位数组

【问题讨论】:

    标签: c# arrays loops search


    【解决方案1】:

    使用 LINQ 怎么样?

    for(int i = 0; i < bits.Length - bitss.Length; i++)
    {
        if (bits.Cast<bool>().Skip(i).Take(bitss.Length).SequenceEqual(bitss.Cast<bool>()))
            Console.WriteLine("Found!");
    }
    

    但要明确一点:会比使用简单的for 循环慢一点!。有点我根本不在乎。

    【讨论】:

    • 这会使BitArray 变得多余..为什么不创建一个 bool 列表然后..如果他将有 1000 个 bool 将 BitArray 转换为 bool 将是昂贵的..
    • @Anirudh LINQ 是惰性的,因此它会在内部一次只获取和比较一项。当您使用[] 运算符在BitArray 上使用索引器时,无论如何都会执行bool 转换,因此您的这部分问题也无效。
    • @MarcinJuraszek 我认为 Anirudn 的意思是比较 BitArrayList,而不是 BitArrayLINQ.
    • 我在我的解决方案和之前的评论中都看不到任何List&lt;bool&gt;,所以我认为这是关于 LINQ。
    • @MarcinJuraszek 因为 op 有两个 bitArray,所以使用 BitArray.Xor 或其他按位操作比 linq 更方便。如果你真的想使用 linq,那么没有理由使用 BitArray
    【解决方案2】:

    绝对可以用另一个for循环来缩短:

    for (int i = 0; i < (bits.Length)-1;i++ ) {
        bool found = true;
        for (int j = 0; j < 32; j++) {
            if (bits[i + j] != bits[j]) {
                found = false;
                break;
            }
        }
        if (found) Console.WriteLine("Found");
    }
    

    【讨论】:

      【解决方案3】:

      只是另一种选择,我发现它更具可读性和可调试性:)

      为您的输入,添加此方法:

      public  string BitArrayToString(BitArray input)
      {
          StringBuilder sb = new StringBuilder();
      
          foreach (var bit in input)
          {
              if ((bool) bit) sb.Append("1");
              else sb.Append("0");
          }
          return sb.ToString();
      }
      

      然后你可以简单地做:

      BitArray bits = new BitArray(100);
      BitArray bitss = new BitArray(32);
      
      bitss.Set(16, true);
      bitss.Set(25, true);
      bitss.Set(26, true);
      bitss.Set(28, true);
      bitss.Set(29, true);
      bitss.Set(31, true);
      
      var bigString = BitArrayToString(bits);
      var smallString = BitArrayToString(bitss);
      
      var cantained = bigString.Contains(smallString);
      

      完成:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 2016-03-08
        • 2013-04-30
        • 2022-01-21
        • 2013-05-28
        • 1970-01-01
        相关资源
        最近更新 更多