C# c语言中的位数组搜索#
若有两个数组,第一个数组大小为100位,第二个数组大小为32位,我想搜索第一个数组中的32位数组100位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
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
但要明确一点:比使用simplefor
循环要慢一点。我一点也不在乎。使用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