Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将结果从第三个方法返回到另一个方法_C#_Oop - Fatal编程技术网

C# 将结果从第三个方法返回到另一个方法

C# 将结果从第三个方法返回到另一个方法,c#,oop,C#,Oop,我有以下问题: 在方法1中,我得到一个字符串列表并将其传递给方法 在方法2中,我基于列表生成一个2d数组,并将列表进一步传递给方法3 在方法3中,我将2d数组转换为数据表 现在我想将数据表返回到方法1,但我不知道如何做。图中显示了我的问题: 我的代码: public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Docu

我有以下问题:

在方法1中,我得到一个字符串列表并将其传递给方法

在方法2中,我基于列表生成一个2d数组,并将列表进一步传递给方法3

在方法3中,我将2d数组转换为数据表

现在我想将数据表返回到方法1,但我不知道如何做。图中显示了我的问题:

我的代码:

public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document doc = commandData.Application.ActiveUIDocument.Document;
            View activeView = commandData.View;

            if(activeView is ViewSchedule)
            {
                GetDimensions(activeView as ViewSchedule);
            }

            return Result.Succeeded;
        }

        public void GetDimensions(ViewSchedule schedule)
        {
            TableSectionData bodySelection = schedule.GetTableData().GetSectionData(SectionType.Body);
            int numberOfRows = bodySelection.NumberOfRows;
            int numberOfColumns = bodySelection.NumberOfColumns;
            string[,] values = new string[numberOfRows,numberOfColumns];
            FillArray(SectionType.Body, bodySelection, numberOfColumns, numberOfRows, values, schedule);
        }

        public void FillArray(SectionType secType, TableSectionData data, 
            int numberOfColumns, int numberOfRows, string[,] values, ViewSchedule schedule)
        {
            for (int r = data.FirstRowNumber; r < numberOfRows; r++)
            {
                for (int c = data.FirstColumnNumber; c < numberOfColumns; c++)
                {
                    values[r, c] = schedule.GetCellText(secType, r, c);
                }
            }

        }

现在,我想返回填充的数组以执行。

不可能以这种方式直接传递它。有三种选择:

让方法2获取结果并传回:

int Method2()
{
    var method3Result = Method3();
    return method3Result;
}

void Method1()
{
    var result = Method2(); //indirectly gets from Method3
}
提供共享状态:

public class Method3Result { public int Value { get; set; } }

public class X
{
    private Method3Result method3Result = new Method3Result();

    public void Method1()
    {
        Method2();

        //process result from method3Result
    }

    public void Method2()
    {
        Method3();
    }

    public void Method3()
    {
        method3Result.Value = 3;
    }
}
提供回调:

   public void Method1()
   {
        int method3Result;    
        Method2(value => method3Result = value);
    }

    public void Method2(Action<int> callback)
    {
        Method3(callback);
    }

    public void Method3(Action<int> callback)
    {
        callback(3);
    }
}
此外,将FillArray更改为类似CreateArray的内容并使其同时返回数组似乎更为清晰:

public void FillArray(SectionType secType, TableSectionData data, int numberOfColumns, int numberOfRows, string[,] values, ViewSchedule schedule)
{
    string[,] values = new string[numberOfRows,numberOfColumns];
    for (int r = data.FirstRowNumber; r < numberOfRows; r++)
        {
            for (int c = data.FirstColumnNumber; c < numberOfColumns; c++)
            {
                values[r, c] = schedule.GetCellText(secType, r, c);
            }
        }

return values;
}

所以它更容易使用。

请发布一些代码?到目前为止您尝试了什么?方法3返回到方法2,然后方法2返回到方法1。或者将引用类型作为参数传递并更新。不用我解释了,先查一下你自己生成的函数2和3返回类型字符串[,],然后返回,然后从每一个返回结果。总体而言,这可能不是最好的方法,但最容易为您的代码进行解释也许您需要完全重构代码,即将函数2和3封装在类调度器中,然后获取ScheduleListreturn of Filled数组-Property@musefan你应该避免在评论中提出无效的主张,而是写一个确实证明我错了的答案。事实上,这个词让人们想要的东西在这个话题中并不有趣。你的第一个例子已经证明你可以做OP要求的事情。。。OP没有直接使用这个词,是你编造的…我没有说OP要求的是不可能的。我说直接做这件事是不可能的。我没有编造这个词——我只是告诉OP直接是不可能的,并提供间接的方法,希望这些选项能满足他们。你似乎从我的回答中读到了一些不真实的东西。如果没有人问,那为什么还要麻烦地提及它呢。。。另外,取决于你对直接的定义是什么。。。我认为这是可能的definition@musefanOP询问了返回值的方法。评估所有可能性似乎是一个很好的方法,可以写出一个涵盖所有可能性的综合答案,即使在某些情况下,它归结为不可能。你在吹毛求疵,我真的不知道你的目标是什么。要么提出一些建设性的改进——我会欣然地考虑它,或者,正如我之前提出的,用你的定义、想法和你认为更好的东西来写你自己的答案。干杯
public void FillArray(SectionType secType, TableSectionData data, int numberOfColumns, int numberOfRows, string[,] values, ViewSchedule schedule)
{
    string[,] values = new string[numberOfRows,numberOfColumns];
    for (int r = data.FirstRowNumber; r < numberOfRows; r++)
        {
            for (int c = data.FirstColumnNumber; c < numberOfColumns; c++)
            {
                values[r, c] = schedule.GetCellText(secType, r, c);
            }
        }

return values;
}