2010-03-03 79 views
2

我的工作,我需要用C#来处理内存中多维数据的问题。我的要求与OLAP立方体相似,但并不复杂。例如我不需要计算或聚合或类似的东西。我基本上想用多维键引用数据。例如:C#立方/多维数据集

var key = new Key(); 
key["Dim1"] = "DimValue1"; 
key["Dim2"] = "DimValue2"; 
key["Time"] = 1999; 
DataSet[key] = 4.43434m; 

而且它允许我迭代数据集的值或切片。你有没有在C#中遇到过这样一个库?

回答

0

您可以创建一个字典,其中的关键类型是声明一个结构。这并不能让你自动迭代片,尽管你可以通过过滤来实现。

1

这可能无法满足您的需要,但我发现一个简单的方法来处理多键数据集是创建一个包含所有的“关键”领域和“价值”键的对象(如多各为你需要),然后为你的每个键创建查找表达式。

例如:

class MyData 
{ 
    // Your keys 
    public string Dim1; 
    public string Dim2; 
    public string Time; 

    // Your values 
    public string Value; 
} 

将 '索引' 和检索这样的:

// add all your data to a list or collection 
var data = new List<MyData>(); 

// this provides the entry point to our dataset 
var lookupDim1 = data.ToLookup(d => d.Dim1); 
var lookupDim2 = data.ToLookup(d => d.Dim2); 
var lookupTime = data.ToLookup(d => d.Time); 

// sample retrievals 
IEnumerable<MyData> sampleData1 = lookupDim1["DimValue1"]; 
var sampleData2 = lookupDim2["DimValue2"].Intersect(lookupTime["1999"]); 
+0

这会派上用场,感谢您的想法。 – 2010-03-03 06:36:03

+0

非常好的主意。我不知道查找。但我认为这会表现得很慢。如果不是O(n^m),其中m是密钥的数量,我认为最好O(n)用于检索。 – duraid 2010-03-03 14:31:20

+0

你的数据集有多大?当使用超过500万条记录时,它对我来说运行速度非常快,每条记录大约4KB。我不知道Lookup LINQ如何工作,但速度非常快。 – 2010-03-05 23:35:52

0

我觉得一个键/值存储像MongoDB的和Redis的接近我所需要的。但我不是100%确定的。因为我不关心持久性,在内存中的故事一样Redis更适合。