我知道 C# 字典基本上是一个键:值对
有没有办法将矩阵存储在 ac# 字典中。
即key是否可以是两个值(行、列)的组合
例如
1 3
4 7
[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7
可以为此构建字典吗?如果是这样,我将如何解析它的元素。如果 key 是单个值,事情会容易得多。
谢谢。
我知道 C# 字典基本上是一个键:值对
有没有办法将矩阵存储在 ac# 字典中。
即key是否可以是两个值(行、列)的组合
例如
1 3
4 7
[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7
可以为此构建字典吗?如果是这样,我将如何解析它的元素。如果 key 是单个值,事情会容易得多。
谢谢。
直接回答您的问题:是的,您可以将矩阵存储在字典中。
Dictionary<Tuple<int,int>, int> matrix;
但更好的方法是将矩阵存储为二维或锯齿状数组。
int[,] matrix; // 2-dmmensional
int[][] matrix; // jagged
数组可能效率低下的唯一情况是矩阵稀疏(即有许多缺失值)。在这种情况下,您可能会考虑使用字典或列表。
您可以使用Tuple<int,int>
( link ) 作为键,因为值需要是不可变的才能成为字典的准确键。我想指出的唯一一件事是,矩阵往往用于按行或按列提取值的情况,如果以这种方式存储它们,您将无法做到这一点。
您是否考虑过使用已经定义矩阵的库?有很多数学库和助手可以做到这一点。
您还可以将矩阵存储在二维数组中:
int[,] matrix = new int[2,2];
matrix[0,0] = 1;
matrix[0,1] = 3;
matrix[1,0] = 4;
matrix[1,1] = 7;
您可以声明Dictionary
使用Tuple
类来存储矩阵:
Dictionary<Tuple<int,int>, int>
甚至KeyValuePair
:
Dictionary<KeyValuePair<int, int>, int>
但是如果你没有任何特定的原因,你应该使用多维数组int[,]
正如我评论的那样,您可以使用普通的旧多维数组,但是既然您问过:
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);