我有一个带行的文件
键值
-----+---------------------------
1 1 2 0.39785 0.39785 0.2043 36
1 1 3 0.409604 0.409604 0.180792 24
1 1 4 0.407281 0.407281 0.185438 24
1 1 5 0.404958 0.404958 0.190084 24
1 1 6 0.403399 0.403399 0.193203 24
...
23 34 36 0.414457 0.354921 0.230622 576
..
-前3个数字是键,代表配对,它们是唯一的,并且它们是递增的
-浮点值链接到键。例如:第一行的第4个元素(0.39785)属于键1,第6个元素(0.2043)属于2。
我逐行阅读并用“”(空格)分割。
我应该如何存储它(哪个集合/结构)。
假设我要查找“ 2 1 1”。
当我写密钥升序时,不会出现“ 2 1 1”之类的条目,
只有“ 1 1 2”,所以首先我必须对它进行排序,但是我想获取值
按查找顺序(0.2043 0.39785 0.39785)。
最佳答案
以下数据结构应满足您的所有要求:
Dictionary<HashSet<int>, Dictionary<int, double>>
使用LINQ从原始数据创建上述结构的实例应该很容易。
访问应该很容易:
从2,1,1创建
HashSet
(2,1)在
Dictionary
->((1,0.39785),(2,0.2043))中查找(2,1)使用部分键查找像2-> 0.2043这样的
double
CAVEAT该解决方案只对在一行上相同的
int
值相同的double
值有效。 (对于提供的样本数据似乎成立)。编辑创建
yourLookup
的代码:List<List<int>> intList = new List<List<int>>() {
new List<int> () {1, 1, 2},
new List<int> () {1, 1, 3},
...
};
List<List<double>> doubleList = new List<List<double>> {
new List<double>() {0.39785, 0.39785, 0.2043},
new List<double>() {0.409604, 0.409604, 0.180792},
....
};
var dictionaries = intList.Zip(doubleList, (Is, Ds) =>
{ return Is.Zip(Ds, (i, d) => new KeyValuePair<int, double>(i, d)).Distinct()
.ToDictionary(kv => kv.Key, kv => kv.Value); });
var yourLookup = dictionaries.Select(
dictionary => new { hashset = new HashSet<int>(dictionary.Keys), dictionary })
.ToDictionary(x => x.hashset, x => x.dictionary);