Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c字典中存储矩阵_C# - Fatal编程技术网

C# 在c字典中存储矩阵

C# 在c字典中存储矩阵,c#,C#,我知道C字典基本上是一个键:值对 有没有办法在c字典中存储矩阵 Dictionary<Tuple<int,int>, int> matrix; 也就是说,键可以是两个值(行、列)的组合吗 比如说 1 3 4 7 [0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7 可以为此编写词典吗?如果是这样,我将如何解析它的元素。如果key是一个值,事情就容易多了 谢谢。直接回答您的问题:是的,您可以在字典中存储矩阵 Dictionary<Tupl

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

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

Dictionary<Tuple<int,int>, int> matrix;
也就是说,键可以是两个值(行、列)的组合吗

比如说

1 3
4 7

[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7
可以为此编写词典吗?如果是这样,我将如何解析它的元素。如果key是一个值,事情就容易多了


谢谢。

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

Dictionary<Tuple<int,int>, int> matrix;
数组效率低下的唯一情况是矩阵稀疏,即缺少许多值。在这种情况下,您可以考虑使用字典或列表。

可以使用元组类声明字典来存储矩阵:

Dictionary<Tuple<int,int>, int>

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

也可以将矩阵存储在二维数组中:
int[,] matrix = new int[2,2];
matrix[0,0] = 1;
matrix[0,1] = 3;
matrix[1,0] = 4;
matrix[1,1] = 7;

您可以使用元组作为键,因为值必须是不可变的,才能成为字典的精确键。我想指出的唯一一点是,矩阵往往用于按行或按列提取值的情况,如果以这种方式存储它们,则无法这样做


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

正如我所评论的,您可以使用普通的多维数组,但既然您要求:

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);

取决于矩阵的规模。如果你有一个非常稀疏的数据矩阵,那么最好存储在字典中。你演示了一个交错数组,而不是一个二维数组,它将是int[,]矩阵。为什么不像在多维数组中那样使用一个实际的矩阵呢`int[,]矩阵=新的int[3,3];'+1-对使用模式的良好评论和对键不可变的提醒限制比真正不可变的限制稍微小一些-在用作字典中的键时不会更改,对于结构值,它要求不可变。
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);