0

我知道 C# 字典基本上是一个键:值对

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

即key是否可以是两个值(行、列)的组合

例如

1 3
4 7

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

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

谢谢。

4

5 回答 5

3

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

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

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

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

数组可能效率低下的唯一情况是矩阵稀疏(即有许多缺失值)。在这种情况下,您可能会考虑使用字典或列表。

于 2013-03-06T16:28:34.300 回答
3

您可以使用Tuple<int,int>( link ) 作为键,因为值需要是不可变的才能成为字典的准确键。我想指出的唯一一件事是,矩阵往往用于按行或按列提取值的情况,如果以这种方式存储它们,您将无法做到这一点。

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

于 2013-03-06T16:32:09.103 回答
2

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

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

于 2013-03-06T16:30:52.643 回答
1

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

Dictionary<Tuple<int,int>, int>

甚至KeyValuePair

Dictionary<KeyValuePair<int, int>, int>

但是如果你没有任何特定的原因,你应该使用多维数组int[,]

于 2013-03-06T16:28:37.893 回答
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);
于 2013-03-06T16:33:19.793 回答