繁体   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