将矩阵存储在c#字典中

时间:2013-03-06 16:27:16

标签: c#

据我所知,C#字典基本上是一个关键:值对

有没有办法将矩阵存储在c#字典中。

也就是说,密钥可以是两个值(行,列)的组合

例如

1 3
4 7

[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7

可以为此构建字典吗?如果是这样,我将如何解析其元素。如果密钥是单个值,事情会容易得多。

感谢。

5 个答案:

答案 0 :(得分:3)

直接回答您的问题:是的,您可以在字典中存储矩阵。

Dictionary<Tuple<int,int>, int> matrix;

但更好的方法是将矩阵存储为二维或锯齿状阵列。

int[,] matrix;    // 2-dmmensional
int[][] matrix;   // jagged

如果矩阵稀疏(即有许多缺失值),则阵列可能效率低下的唯一时间。在这种情况下,您可以考虑使用词典或列表。

答案 1 :(得分:3)

您可以使用Tuple<int,int>link)作为键,因为值必须是不可变的才能成为字典的准确键。我要指出的唯一一点是,矩阵倾向于在按行或按列提取值的情况下使用,如果以这种方式存储它们,则无法执行此操作。

您是否考虑过使用定义基质的库?有很多数学库和助手可以做到这一点。

答案 2 :(得分:2)

您还可以将矩阵存储在二维数组中:

int[,] matrix = new int[2,2];
matrix[0,0] = 1;
matrix[0,1] = 3;
matrix[1,0] = 4;
matrix[1,1] = 7;

答案 3 :(得分:1)

您可以使用Dictionary类声明Tuple来存储矩阵:

Dictionary<Tuple<int,int>, int>

甚至KeyValuePair

Dictionary<KeyValuePair<int, int>, int>

但如果您没有任何具体原因,则应使用多维数组int[,]

答案 4 :(得分:0)

正如我评论的那样,您可以使用普通的旧多维数组,但是因为您问过:

var array = new int[,]
{
    {1,2,3},
    {4,5,6},
    {7,8,9},
};
var query = 
    from row in Enumerable.Range(0, array.GetUpperBound(0))
    from col in Enumerable.Range(0, array.GetUpperBound(1))
    select new KeyValuePair<Tuple<int,int>, int>(
                Tuple.Create(row,col), 
                array[row,col]);
var asDict = query.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);