在DataTable中查找行最快的方法- .Find()或…

本文关键字:Find 方法 DataTable 查找 | 更新日期: 2023-09-27 18:08:03

我需要通过键非常快地找到数据表中的行。为此,我将数据表转换为<Tuple<key1, key2, ..., keyN>, Datarow>类型的字典,并且可以像

那样快速查找记录。
var result = myDict[Tuple("aaa", 123, ...)];

.Find()方法更快吗?它是如何工作的?我知道我可以只是做一些样品,并尝试他们,但如果有人知道这种方法是如何在内部工作,那么它可以帮助我在未来。谢谢你!

在DataTable中查找行最快的方法- .Find()或…

Dictionary使用哈希表查找,因此对于单个键,它将尽可能快地获得。

如您所知,Dictionary有一个键,因此您使用Tuple将多个值打包到该键中。元组必须是唯一的才能成为键——因为你今天要做这个,所以必须是这样。

请注意,Tuple可能会遭受很多哈希冲突。您可以通过在所有键上运行GetHashCode来测试,看看有多少次碰撞。把最独特的值放在元组的前面。

如果你有一个好的哈希值,那么字典是0 (1)

DataRowCollection。Find是文档化的。查找(Find)是O(log n),为什么你需要知道它的内部工作原理?测试一下。考虑构建Dictionary所花费的时间。

如果你正在使用数据表之间的关系,你应该使用数据关系。

如果要进行大量搜索,使用select方法会很慢。字典使用哈希表来执行查找,这将是最快的方法。试试下面的代码

            Dictionary<Tuple<string,string,string>,List<DataRow>>  myDict1 = dt.AsEnumerable()
                .GroupBy(x => new Tuple<string, string, string>(x.Field<string>("Col A"), x.Field<string>("Col A"), x.Field<string>("Col A")), y => y)
                .ToDictionary(x => x.Key, y => y.ToList());
           //if only one value per key then use this
            Dictionary<Tuple<string, string, string>, DataRow> myDict2 = dt.AsEnumerable()
                .GroupBy(x => new Tuple<string, string, string>(x.Field<string>("Col A"), x.Field<string>("Col A"), x.Field<string>("Col A")), y => y)
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());​