簡體   English   中英

將多維數組轉換為多維字典

[英]Convert multi-dimensional array to multi-dimensional dictionary

如何使用Lambda將int的多維數組轉換為多維字典?

例如,我想將 Test1 (int[2,3]) 轉換為 Test 3 (Dictionary<(int,int),int>)

    int[,] Test1 = new int[2, 3];
    int k = 0;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Test1[i, j] = k++;
        }
    }

我可以使用“for - next”循環的傳統方式輕松地將它轉換成字典,但是當我嘗試使用 lambda 時:

Dictionary<(int,int),int>Test3 = Enumerable.Range(0, Test1.Length)
    .ToDictionary((int i ,int j )=>new { z =Test1[i, j] });

我收到以下語法錯誤:

Error   CS0411  The type arguments for method 'Enumerable.ToDictionary<TSource, TKey>(IEnumerable<TSource>, Func<TSource, TKey>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

如何明確指定類型 arguments?

不幸的是,您不能輕松地使用 Linq 循環遍歷二維數組的“行”,因為方形數組的迭代器只是循環遍歷元素。 您需要使用老式的for循環:

var Test3 = new Dictionary<(int,int),int>();

for (int i = 0; i < Test1.GetLength(0); i++)
{
    Test3[(Test1[i, 0], Test1[i, 1])] =  Test1[i, 2];
}

這假設前兩個“列”中的對是唯一的,否則最后一個將“獲勝”。

可以使用 Linq 通過在一個軸上使用Range來枚舉行,就像您嘗試做的那樣:

Dictionary<(int,int),int>Test3 = Enumerable
    .Range(0, Test1.GetLength(0))
    .ToDictionary(i => (Test1[i, 0], Test1[i, 1]), i => Test1[i, 2]);

請注意, ToDictionary中的 lambda 表達式分別定義了鍵和值。

但在我看來, for循環更簡潔、更容易理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM