问题:我正试图创建一个返回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是可控的。