C# 辞書は基本的にキーと値のペアであることを理解しています
行列を ac# 辞書に格納する方法はありますか。
つまり、キーは 2 つの値 (行、列) の組み合わせにすることができますか?
例えば
1 3
4 7
[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7
このために辞書を構築できますか?もしそうなら、その要素をどのように解析しますか。key が単一の値である場合は、はるかに簡単です。
ありがとう。
C# 辞書は基本的にキーと値のペアであることを理解しています
行列を ac# 辞書に格納する方法はありますか。
つまり、キーは 2 つの値 (行、列) の組み合わせにすることができますか?
例えば
1 3
4 7
[0][0]:1, [0][1]:3, [1][0]:4, [1][1]:7
このために辞書を構築できますか?もしそうなら、その要素をどのように解析しますか。key が単一の値である場合は、はるかに簡単です。
ありがとう。
辞書の正確なキーであるためには値が不変である必要があるため、キーとしてTuple<int,int>
(リンク)を使用できます。私が指摘したいのは、行列は行または列で値を抽出する状況で使用される傾向があることです。この方法で値を格納すると、それを実行できなくなります。
行列を定義するライブラリの使用をすでに検討しましたか?まさにそれを行う数学ライブラリとヘルパーがたくさんあります。
質問に直接答えるには: はい、行列を辞書に保存できます。
Dictionary<Tuple<int,int>, int> matrix;
しかし、はるかに優れた方法は、行列を 2 次元またはギザギザの配列として格納することです。
int[,] matrix; // 2-dmmensional
int[][] matrix; // jagged
配列が非効率的である可能性があるのは、マトリックスがまばらな場合 (つまり、欠損値が多数ある場合) だけです。その場合、Dictionary または List の使用を検討してください。
行列を 2 次元配列に格納することもできます。
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);