Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的位数组搜索#_C#_Arrays_Loops_Search - Fatal编程技术网

C# c语言中的位数组搜索#

C# c语言中的位数组搜索#,c#,arrays,loops,search,C#,Arrays,Loops,Search,若有两个数组,第一个数组大小为100位,第二个数组大小为32位,我想搜索第一个数组中的32位数组100位 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); f

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

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");
位数组位=新位数组(100);
BitArray bitss=新的位数组(32);
比特集(16,真);
比特集(25,真);
比特设置(26,真);
比特集(28,真);
比特集(29,真);
比特集(31,真);
对于(int i=0;i<(bits.Length)-1;i++)
if((位[i]==位[0]&&
位[i+1]==位[1]&&
位[i+2]==位[2]&&
位[i+3]==位[3]&&
...
位[i+31]==位[31]))
控制台。写入线(“找到”);

是否有更好的方法在不使用C#

中的(if and==)的情况下在位数组中搜索位数组?它肯定可以用另一个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");
}
for(int i=0;i<(bits.Length)-1;i++){
布尔发现=真;
对于(int j=0;j<32;j++){
if(位[i+j]!=位[j]){
发现=错误;
打破
}
}
如果(找到)控制台写入线(“找到”);
}

它肯定可以用另一个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");
}
for(int i=0;i<(bits.Length)-1;i++){
布尔发现=真;
对于(int j=0;j<32;j++){
if(位[i+j]!=位[j]){
发现=错误;
打破
}
}
如果(找到)控制台写入线(“找到”);
}
使用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(int i=0;i
但要明确一点:比使用simple
for
循环要慢一点
。我一点也不在乎。使用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(int i=0;i

但要明确一点:比使用simple
for
循环要慢一点
。我一点也不在乎。

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

对于您的输入,请添加以下方法:

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);

完成:)

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

对于您的输入,请添加以下方法:

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);

完成:)

这将使
位数组成为多余的。.为什么不创建一个布尔列表呢。.如果他要有1000个布尔,将位数组转换为布尔将是昂贵的。@Anirudh LINQ很懒惰,所以它在内部一次只会获取和比较一个项目。当您使用
[]
运算符对
位数组
使用索引器时,仍然会执行
bool
强制转换,因此您的这部分担心也无效。@MarcinJuraszek我想Anirudn是想比较位数组和列表,不是BitArray和LINQ。我的解决方案和以前的注释中都看不到任何
列表
,所以我认为这是关于LINQ的。@MarcinJuraszek因为op有两个位数组,所以使用
bitArray.Xor
或其他按位运算比LINQ更方便。如果你真的想使用LINQ,那么就没有理由使用bitArray,这会使
bitArray
冗余。那么为什么不创建一个bool列表呢?如果他有1000个bool将位数组转换为bool将花费高昂。@Anirudh LINQ很懒惰,因此它在内部一次只能获取并比较一个项目。当您使用
[]
运算符对
位数组
使用索引器时,仍然会执行
bool
强制转换,因此您的这部分担心也无效。@MarcinJuraszek我想Anirudn是想比较位数组和列表,不是BitArray和LINQ。我的解决方案和之前的注释中都看不到任何
列表,所以我认为这是关于LINQ的。@MarcinJuraszek因为op有两个BitArray,所以使用
BitArray.Xor
或其他比LINQ更方便。如果你真的想使用LINQ,那么就没有理由使用BitArray