我有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();
那么,有什么解决方案吗? 如果是的话,请尽快让我知道。 感谢
答案 0 :(得分:1)
Intersect
和 Union
不是最快的操作。你认为它很快的原因是你从来没有真正枚举结果!
两者都返回一个可枚举的,而不是实际的操作结果。你应该通过它并枚举可枚举,否则没有任何反应 - 这被称为“延迟执行”。现在,当您执行 Count
时,实际上枚举了可枚举,并产生了 Intersect
和 Union
的全部成本 - 相信我,< code> Count 本身相对简单(虽然仍然是O(n)操作!)。
你需要制作自己的方法,很可能。您希望避免可枚举的开销,更重要的是,您可能需要查找表。
&#xA;答案 1 :(得分:1)
几点:评论for (NSLayoutConstraint *constraint in logoImage.constraints) {
if ([constraint.identifier isEqualToString:@"logoTopIdentifier"]) {
constraint.constant=10;
}
}
具有误导性,因为它是缓冲区大小。 // get file length
不是读取的字节数,而是读取的块数。 Counter
和data
将以最后一个块读取的结果结束,忽略它们之前的任何数据。假设while循环没有出错 - 您需要删除try结构以查看是否存在任何错误。
你可以做的是计算每个文件中每个字节的出现次数,然后如果任何文件中的一个字节的数量大于1,那么它就是交集的成员对于文件,如果所有文件中的字节数大于1,那么它就是文件联合的成员。
为两个文件编写两个以上文件的代码同样容易,而LINQ对于两个文件来说很容易,但对于两个以上文件则更为繁琐。 (我最初只用两个文件,以天真的方式使用LINQ进行比较。)
data1
计数字节出现的方法大约是我计算机上LINQ方法的五倍,即使没有后者加载文件和一系列文件大小(几KB到几MB)。 / p>