我需要通过键非常快地找到数据表中的行。为此,我将数据表转换为<Tuple<key1, key2, ..., keyN>, Datarow>
类型的字典,并且可以像
var result = myDict[Tuple("aaa", 123, ...)];
.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());