据我所知,C#字典基本上是一个关键:值对
有没有办法将矩阵存储在c#字典中。
也就是说,密钥可以是两个值(行,列)的组合
例如
1 3
4 7
[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7
可以为此构建字典吗?如果是这样,我将如何解析其元素。如果密钥是单个值,事情会容易得多。
感谢。
答案 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);