C#通用2D数组作为返回类型

时间:2016-07-19 10:22:52

标签: c# generics multidimensional-array

问题:我正在尝试创建一个返回2D数组的方法。根据条件,必须返回不同的2D数组(一个是二维的二维数组,另一个是二维的二维数组)。如何声明这种条件的返回类型比“对象”更精确?可能值得注意的是,2D数组在其他地方被实例化,它们的元素仅在这里给出值。

    public static double[,] ParseData(Dictionary<DateTime, int> dateColumnIndexDict, double[,] tableData)
    {
        ScenarioUtil.dateColumnIndexDict = dateColumnIndexDict;
        ScenarioUtil.tableData = tableData;
        return (double[,])InnerParseData();
    }

    public static Dictionary<string, double>[,] ParseData(bool isOldDictFilled, Dictionary<string, double> newNameHoursDict, Dictionary<string, double> oldNameHoursDict)
    {
        ScenarioUtil.isOldDictFilled = isOldDictFilled;
        ScenarioUtil.newNameHoursDict = newNameHoursDict;
        ScenarioUtil.oldNameHoursDict = oldNameHoursDict;
        return (Dictionary<string, double>[,])InnerParseData();
    }

    private static object InnerParseData()
    {
        /* code that assigns values to arrays elements are returns the right array */
    }

场景:我在几个类中有一些嵌套for循环,只在内部for循环中有所不同。它们提供类似但不完全相同的目的,因为一些填充二维数组的双打,有些填充字典。我试图找到一个解决方案来重构代码到一些实用程序类,但我没有提出任何体面的解决方案,因为参数的数量和类型总是不同,以及返回类型。我想出的最佳解决方案最终解决了上述问题。由于我需要在其中一个场景中返回2个词典,我将它们放入2D数组中尽可能接近正确的类型,但我仍然无法通过相互返回类型传递给它的类型二维阵列。

有关此问题的任何帮助,甚至是如何彻底更改方案的解决方案都表示赞赏。代码在试验和错误中有点混乱,但如果问题描述不清楚,我可以尝试提取可呈现的东西。

对于有问题的循环:

for (Int64 i = 0; i < dataLength; i++)
        {
            Int64 workItemsLength = (Int64)js.ExecuteScript("return loadedData[" + i + "].WorkItem.length");

            for (Int64 j = 0; j < workItemsLength; j++)
            {
                Int64 workItemHourLength = (Int64)js.ExecuteScript("return loadedData[" + i + "].WorkItem[" + j + "].WorkItemHour.length");

                for (Int64 k = 0; k < workItemHourLength; k++)
                {
                    string date = (string)js.ExecuteScript("return loadedData[" + i + "].WorkItem[" + j + "].WorkItemHour[" +k +"].Date");
                    double hours = Convert.ToDouble(js.ExecuteScript("return loadedData[" + i + "].WorkItem[" + j + "].WorkItemHour[" + k + "].Hours"));

                    DateTime dt = Convert.ToDateTime(date);
                    int value;

                    if (dateColumnIndexDict.TryGetValue(dt, out value))
                    {
                        tableData[j, (value - 1)] = hours;
                    }
                }
            }
        }

for (Int64 i = 0; i < dataLength; i++)
        {
            Int64 workItemsLength = (Int64)js.ExecuteScript("return loadedData[" + i + "].WorkItem.length");

            for (Int64 j = 0; j < workItemsLength; j++)
            {
                string workItemName = (string)js.ExecuteScript("return loadedData[" + i + "].WorkItem[" + j + "].Name");
                double workItemTotalHours = 0;
                Int64 workItemHourLength = (Int64)js.ExecuteScript("return loadedData[" + i + "].WorkItem[" + j + "].WorkItemHour.length");

                for (Int64 k = 0; k < workItemHourLength; k++)
                {
                    workItemTotalHours += Convert.ToDouble(js.ExecuteScript("return loadedData[" + i + "].WorkItem[" + j + "].WorkItemHour[" + k + "].Hours"));
                }

                if (isOldDictFilled)
                {
                    newNameHoursDict.Add(workItemName, workItemTotalHours);
                }
                else
                {
                    oldNameHoursDict.Add(workItemName, workItemTotalHours);
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

如果你必须从一个方法中返回多个项目,你可以将它们塞进一个元组中。如果你不能定义一个合适的接口类型,你可能只能回到对象并在以后对其进行排序。这是一个可维护性问题,但如果您知道您正在使用有限的类型集。这是可以管理的。