C# 遍历列表的最快方式<;字节[]>;由1000个元素组成
我的数据库中有一千个指纹存储在一个Byte[]数组中,我正在尝试对指纹进行1:N验证,这意味着我需要比较传感器给出的指纹和数组中的指纹 但是这个过程花费的时间太长了,我正在使用forEach循环迭代数组中的所有指纹,并调用验证方法来比较两个数组以找到匹配项 有没有办法让我更快地找到匹配项?在最坏的情况下,匹配项是数组中的最后一项。或者接近底部 指纹列表C# 遍历列表的最快方式<;字节[]>;由1000个元素组成,c#,list,optimization,foreach,fingerprint,C#,List,Optimization,Foreach,Fingerprint,我的数据库中有一千个指纹存储在一个Byte[]数组中,我正在尝试对指纹进行1:N验证,这意味着我需要比较传感器给出的指纹和数组中的指纹 但是这个过程花费的时间太长了,我正在使用forEach循环迭代数组中的所有指纹,并调用验证方法来比较两个数组以找到匹配项 有没有办法让我更快地找到匹配项?在最坏的情况下,匹配项是数组中的最后一项。或者接近底部 指纹列表 对不起,关于西班牙语的评论。你可以使用“字典
对不起,关于西班牙语的评论。你可以使用“字典
注意:即使未知指纹的(散列)列表只包含一个结果,您仍然必须验证实际的字节数组(或提取的特征):指纹很有可能是一个新的指纹,恰好与数据库中的一个指纹产生相同的哈希值。您可以使用“Dictionary
注意:即使未知指纹的(散列)列表只包含一个结果,您仍然必须验证实际的字节数组(或提取的特征):指纹很有可能是一个新的指纹,恰好与数据库中的一个指纹产生相同的哈希值。通过删除不匹配的项目来减少必须搜索的项目数。有很多方法可以做到这一点,但可以举一个例子:
这只是一个没有任何代码的对话示例,但我想你已经明白了。一种简单的方法是创建一个名为FingerPrint的类来表示字节数组,重写它的GetHashCode()和Equals(),但不能保证完全匹配,而且速度要慢得多方法,只需使用哈希表实例执行搜索。通过删除不匹配的项来减少必须搜索的项的数量。有很多方法可以做到这一点,但可以举一个例子:
List<Huellas> ListaHuellas = new List<Huellas>();
public class Huellas
{
public int idUsuario;
public Byte[] Huella;
}
foreach (Huellas h in ListaHuellas) {
// Por cada huella... la almacenamos en un MemoryStream como arreglo de bytes.
MemoryStream fingerprintData = new MemoryStream(h.Huella);
// Creamos una plantilla a partir de esos bytes...
DPFP.Template templateIterando = new DPFP.Template(fingerprintData);
// Extraemos las caracteristicas de la plantilla
DPFP.FeatureSet features = ExtractFeatures(Sample, DPFP.Processing.DataPurpose.Verification);
// Verificamos que las caracteristicas sean buenas
if (features != null) {
// Compare the feature set with our template
DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
Verificator.Verify(features, templateIterando, ref result);
// Y vemos si el resultado es valido o no, (verified)
// Si es verified, significa que el dedo escaneado ya existia en la base de datos.
if (result.Verified) {
MessageBox.Show(new Form { TopMost = true }, "Usuario encontrado: ID " + h.idUsuario);
// Por ultimo se cierra el programa.
this.Invoke(new MethodInvoker(delegate { this.Close(); }));
}
}
}