Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过多个键组合的海量数据进行搜索C#_C#_Arrays_Performance_List_Dictionary - Fatal编程技术网

通过多个键组合的海量数据进行搜索C#

通过多个键组合的海量数据进行搜索C#,c#,arrays,performance,list,dictionary,C#,Arrays,Performance,List,Dictionary,我想以最快的方式通过大量数据进行搜索,这些数据由多个键组成。 我有一个包含此信息的文件,但我想将其加载到内存中。内存电容不是问题 key1 | key2 | key3 | key4 | value1 | value2 -----|------|------|------|--------|-------- 1 | 1 | 1 | 1 | str | 20 1 | 1 | 1 | 2 | str | 20 1 | 1 | 1

我想以最快的方式通过大量数据进行搜索,这些数据由多个键组成。 我有一个包含此信息的文件,但我想将其加载到内存中。内存电容不是问题

key1 | key2 | key3 | key4 | value1 | value2
-----|------|------|------|--------|--------
1    | 1    | 1    | 1    | str    | 20
1    | 1    | 1    | 2    | str    | 20
1    | 1    | 1    | 3    | str    | 20
1    | 1    | 2    | 1    | str    | 20
2    | 1    | 1    | 1    | str    | 20
我看过一些收藏品,但仍不确定:

也许多键词典会更好,因为它避免了键中的大量冗余

public class MultiKeyDictionary<T1, T2, T3> : Dictionary<T1, Dictionary<T2, T3>>


key1 | key2 | key3 | key4 | value1 | value2
-----|------|------|------|--------|--------
1    | 1    | 1    | 1    | str    | 20
     |      |      | 2    | str    | 20
     |      |      | 3    | str    | 20
     |      | 2    | 1    | str    | 20
2    | 1    | 1    | 1    | str    | 20
公共类多键字典:字典
键1 |键2 |键3 |键4 |值1 |值2
-----|------|------|------|--------|--------
1 | 1 | 1 | 1 | str | 20
|| | 2 | str | 20
|| | 3 | str | 20
|| 2 | 1 | str | 20
2 | 1 | 1 | 1 | str | 20
我不会寻找每一把钥匙,但可能是其中的50%。
我甚至愿意接受疯狂的建议。

你可以简单地使用你的键的
元组作为字典键和值

var bank = new Dictionary<Tuple<int, int, int, int, int>, Tuple<string, int>>();

bank.Add(Tuple.Create(k1, k2, k3, k4), Tuple.Create("str", 20));
var bank=newdictionary();
添加(Tuple.Create(k1,k2,k3,k4),Tuple.Create(“str”,20));

您能否具体化为每次搜索单独优化的数据的多个副本?为Key1编制索引,为key2编制索引,等等。您能否更具体地说明需要对该数据执行的具体查询?我可以按键从左到右拆分数据,但要访问键2,我需要先访问键1。所以每个右键都在左键的集合中。键4在键3中,键3在键2中…假设我的键是国家->州->城市->房子。它们都来自一个键。有一个相关的帖子有很多提示:2GB的大小限制是多少?您需要并发访问吗?你的钥匙是独一无二的吗?对查询进行并行化、对数据进行分区等可能值得深入研究的事情很多。不,因为如果他只想找到一个键的匹配项,他无法找到,那么你只需将所有键组合成一个键,将每个记录限制为一个键,这不是问题所在。@Eluvatar在这种情况下,他可以使用字典库,让每个键指向同一元组值key1-4,生成一个键。我想用字典之类的东西来避免键中的冗余。。。但性能至关重要,所以。。。