そのための方法は見つかりませんでした。
C# では、インスタンス化されたクラスにパブリック メソッドを「追加」するために、拡張メソッド ([1] を参照) を使用できます。
その場合、これを行うことができます:
namespace StackOverFlow
{
static class Program
{
public static bool Find(this System.Collections.BitArray text, System.Collections.BitArray pattern)
{
//... implement your search algorithm here...
}
static void Main(string[] args)
{
System.Collections.BitArray bitsarr = new System.Collections.BitArray(150);
bool result = bitsarr.Find(new System.Collections.BitArray(new
bool[]{true, true, false, true}));
Console.WriteLine("Result: {0}", result);
}
}
}
ネット上でいくつかのマッチング アルゴリズムを見つけることができます。この回答の下部に 2 つのリンク [2,3] を追加しました。
特殊なケースとして、検索文字列が 32 ビットの場合、Dömölki-(Baeza-Yates)-Gonnet アルゴリズム [4,5,6,7] をお勧めします。
可能な文字セットには 2 つの要素 (0 と 1) が含まれているため、この変更は、32 ビット長のパターンを検索している場合にのみ有効です。
namespace StackOverFlow
{
static class Program
{
public static bool IsFound(this System.Collections.BitArray text, System.Collections.BitArray pattern)
{
uint B = 0;
for (ushort i = 0; i < pattern.Length; i++)
{
if (pattern[i])
{
uint num = 1;
B |= num << i;
}
}
return IsFound(text, B);
}
public static bool IsFound(this System.Collections.BitArray text, uint B)
{
uint nB = ~B;
uint D = 0;
const uint end = ((uint)1) << 31;
for (int i = 0; i < text.Length; i++ )
{
uint uD = (D << 1) + 1;
D = uD & (text[i] ? B : nB);
if ((D & end) > 0)
{
return true;
}
}
return false;
}
static void Main(string[] args)
{
System.Collections.BitArray bitsarr = new System.Collections.BitArray(150);
//Tests:
bitsarr[0] = true;
bitsarr[1] = true;
bitsarr[2] = false;
bitsarr[3] = true;
bitsarr[50] = true;
bitsarr[51] = true;
bitsarr[52] = true;
bitsarr[53] = false;
bitsarr[54] = false;
bool result = bitsarr.IsFound(new System.Collections.BitArray(new bool[]{true, true, false, true}));
Console.WriteLine("Result: {0}, expected True", result);
result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { true, true, true, true }));
Console.WriteLine("Result: {0}, expected False", result);
result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { true, true, true, false }));
Console.WriteLine("Result: {0}, expected True", result);
result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { false, true, true, true }));
Console.WriteLine("Result: {0}, expected True", result);
result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { false, true, true, true }));
Console.WriteLine("Result: {0}, expected True", result);
Console.ReadKey();
}
}
}
注: さらにテストが必要です。
(評判が10必要なので、ここにリンクを追加することはできません)