Intersect和Union在2个文件的字节数组中

时间:2015-11-28 06:29:23

标签: c# bytearray union filestream intersection

我有2个文件。 1是源文件,第2是目标文件。

下面是使用字节数组的Intersect和Union两个文件的代码。

FileStream frsrc = new FileStream("Src.bin", FileMode.Open);
FileStream frdes = new FileStream("Des.bin", FileMode.Open);
int length = 24; // get file length
byte[] src = new byte[length];
byte[] des = new byte[length]; // create buffer
int Counter = 0;   // actual number of bytes read
int subcount = 0;

while (frsrc.Read(src, 0, length) > 0)
{
    try
    {
        Counter = 0;
        frdes.Position = subcount * length;
        while (frdes.Read(des, 0, length) > 0)
        {                               
                var  data = src.Intersect(des);                          
                var data1 = src.Union(des);                               
                Counter++;                               
        }        
        subcount++;
        Console.WriteLine(subcount.ToString());
        }
    }
    catch (Exception ex)
    {                          
    }
}

以最快的速度工作正常。 但现在的问题是,我想要它的数量,当我使用下面的代码然后它变得非常慢。

  var  data = src.Intersect(des).Count();                          
  var  data1 = src.Union(des).Count();

那么,有什么解决方案吗? 如果是的话,请尽快让我知道。 感谢

2 个答案:

答案 0 :(得分:1)

Intersect Union 不是最快的操作。你认为它很快的原因是你从来没有真正枚举结果!





两者都返回一个可枚举的,而不是实际的操作结果。你应该通过它并枚举可枚举,否则没有任何反应 - 这被称为“延迟执行”。现在,当您执行 Count 时,实际上枚举了可枚举,并产生了 Intersect Union 的全部成本 - 相信我,< code> Count 本身相对简单(虽然仍然是O(n)操作!)。

&#xA;&#xA;

你需要制作自己的方法,很可能。您希望避免可枚举的开销,更重要的是,您可能需要查找表。

&#xA;

答案 1 :(得分:1)

几点:评论for (NSLayoutConstraint *constraint in logoImage.constraints) { if ([constraint.identifier isEqualToString:@"logoTopIdentifier"]) { constraint.constant=10; } } 具有误导性,因为它是缓冲区大小。 // get file length不是读取的字节数,而是读取的块数。 Counterdata将以最后一个块读取的结果结束,忽略它们之前的任何数据。假设while循环没有出错 - 您需要删除try结构以查看是否存在任何错误。

你可以做的是计算每个文件中每个字节的出现次数,然后如果任何文件中的一个字节的数量大于1,那么它就是交集的成员对于文件,如果所有文件中的字节数大于1,那么它就是文件联合的成员。

为两个文件编写两个以上文件的代码同样容易,而LINQ对于两个文件来说很容易,但对于两个以上文件则更为繁琐。 (我最初只用两个文件,以天真的方式使用LINQ进行比较。)

data1

计数字节出现的方法大约是我计算机上LINQ方法的五倍,即使没有后者加载文件和一系列文件大小(几KB到几MB)。 / p>