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



问题:我正试图创建一个返回2D数组的方法。根据条件的不同,必须返回不同的2D数组(一个是双精度的2D数组,另一个是字典的2D数组)。如何为这样一个比"object"更精确的条件声明返回类型?值得注意的是,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循环中有所不同。它们的用途相似,但并不完全相同,因为有些填充替身的2D阵列,有些填充字典。我正试图想出一个解决方案来将代码重构为某个实用程序类,但我还没有想出任何像样的解决方案,因为参数的数量和类型以及返回类型总是不同的。我想出的最好的解决方案最终解决了上面的问题。由于我需要在其中一个场景中返回2个字典,我已经将它们放入一个2D数组中,以尽可能接近正确的类型,但我仍然无法通过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);
                }
            }
        }

如果必须从一个方法返回多个项,则可以将它们放入元组中。如果不能定义适当的接口类型,则可以返回到对象,稍后进行排序。这是一个可维护性问题,但如果您知道您使用的是有限的类型集。itt是可控的。

相关内容

  • 没有找到相关文章