0

C# 辞書は基本的にキーと値のペアであることを理解しています

行列を ac# 辞書に格納する方法はありますか。

つまり、キーは 2 つの値 (行、列) の組み合わせにすることができますか?

例えば

1 3
4 7

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

このために辞書を構築できますか?もしそうなら、その要素をどのように解析しますか。key が単一の値である場合は、はるかに簡単です。

ありがとう。

4

5 に答える 5

3

辞書の正確なキーであるためには値が不変である必要があるため、キーとしてTuple<int,int>リンク)を使用できます。私が指摘したいのは、行列は行または列で値を抽出する状況で使用される傾向があることです。この方法で値を格納すると、それを実行できなくなります。

行列を定義するライブラリの使用をすでに検討しましたか?まさにそれを行う数学ライブラリとヘルパーがたくさんあります。

于 2013-03-06T16:32:09.103 に答える
3

質問に直接答えるには: はい、行列を辞書に保存できます。

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

しかし、はるかに優れた方法は、行列を 2 次元またはギザギザの配列として格納することです。

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

配列が非効率的である可能性があるのは、マトリックスがまばらな場合 (つまり、欠損値が多数ある場合) だけです。その場合、Dictionary または List の使用を検討してください。

于 2013-03-06T16:28:34.300 に答える
2

行列を 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 に答える