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

C#作为返回类型的通用2D数组,c#,generics,multidimensional-array,C#,Generics,Multidimensional Array,问题:我试图创建一个返回2D数组的方法。根据条件,必须返回不同的2D数组(一个是双精度2D数组,另一个是字典2D数组)。如何为这种比“对象”更精确的条件声明返回类型?可能值得注意的是,2D数组是在别处实例化的,它们的元素在这里只被赋予值 public static double[,] ParseData(Dictionary<DateTime, int> dateColumnIndexDict, double[,] tableData) { Scena

问题:我试图创建一个返回2D数组的方法。根据条件,必须返回不同的2D数组(一个是双精度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 */
    }
publicstaticdouble[,]ParseData(Dictionary-dateColumnIndexDict,double[,]tableData)
{
ScenarioUtil.dateColumnIndexDict=dateColumnIndexDict;
ScenarioUtil.tableData=tableData;
返回(双[,])InnerParseData();
}
公共静态字典[,]ParseData(bool isOldDictFilled,字典newNameHoursDict,字典oldNameHoursDict)
{
ScenarioUtil.isOldDictFilled=isOldDictFilled;
ScenarioUtil.newnamehursdict=newnamehursdict;
ScenarioUtil.oldnameoursdict=oldnameoursdict;
返回(字典[,])InnerParseData();
}
私有静态对象InnerParseData()
{
/*为数组元素赋值的代码返回正确的数组*/
}
场景:我在几个类中有一些嵌套的for循环,这些类只在内部for循环中有所不同。它们的用途类似,但并不完全相同,因为有些填充二维双精度数组,有些填充字典。我正试图找到一个将代码重构为某个实用程序类的解决方案,但我还没有找到任何合适的解决方案,因为参数的数量和类型以及返回类型总是不同的。我想出的最佳解决方案就是上面的问题。因为我需要在其中一个场景中返回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);
                }
            }
        }
for(Int64 i=0;i
如果您必须从一个方法返回多个项,您可以将它们塞进一个元组中,如果您不能定义适当的接口类型,您可以返回到object并在以后对其进行排序。这是一个可维护性问题,但如果您知道您使用的是有限的类型集。itt是可管理的。

您是否至少可以为主方法和它调用的dictionary([])添加方法签名可以工作,您可以使用数组中的边界<0作为备选索引。。。您需要确定这对您是否有意义,或者使用字典的键来传达信息您应该明确地发布相关对象的一些代码示例,最重要的是前面提到的for循环,您正在尝试在类之间联合。使用模板可能是一个很好的解决方案,具体取决于类。@Rhumborl我添加了签名并对问题进行了一些编辑,似乎我忽略了一个部分。请告诉我是否应该添加更多的方法签名,或者您是否需要其他方法签名。@o_weisman我已经按照您的要求添加了for循环。使用dynamic而不是object有什么优点/缺点吗?