我有一个带行的文件
 键值

-----+---------------------------
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);

10-06 14:26