问题:我正在尝试创建一个返回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);
}
}
}
答案 0 :(得分:1)
如果你必须从一个方法中返回多个项目,你可以将它们塞进一个元组中。如果你不能定义一个合适的接口类型,你可能只能回到对象并在以后对其进行排序。这是一个可维护性问题,但如果您知道您正在使用有限的类型集。这是可以管理的。