【问题标题】:Class method to return multiple results (lists and multi-dimensional arrays)返回多个结果的类方法(列表和多维数组)
【发布时间】:2015-02-15 14:42:34
【问题描述】:

我有一个类,它的方法生成一些结果并填充 List 和 double[,]。因此,在进行计算时,最终结果存储在 double[,] 中,但中间结果存储在 List 中。

类似这样的:

public double[,] methodOne(Dictionary<string, double> myInputOne, List<double> myInputTwo)
{
List<double> intermediateResults= new List<double>();
double[,] finalResults= new double[rows, cols];

// Do some calculation using myInputOne and myInputTwo

intermediateResults.Add(something);

// Continue the calculation using also intermediateResults
// store results in double[,] finalResults

return results ;
}

这仅在您希望该方法返回结果表时才有效。但是我怎样才能告诉方法也返回 List intermediateResults?

我希望这个方法能够返回中间结果和最终结果,以便以后的其他方法可以使用它们。谢谢你。

【问题讨论】:

标签: c# class methods


【解决方案1】:

不要返回单个类型或元组,而是返回一个自定义对象,因为它会使调用代码更具可读性:

public class Results
{
    public List<double> IntermediateResults { get; set; }
    public double[,] FinalResults { get; set; }
}

那么你的方法看起来像:

public Results methodOne(Dictionary<string, double> myInputOne, List<double> myInputTwo)
{
   List<double> intermediateResults = new List<double>();
   double[,] finalResults = new double[rows, cols];

   // Do some calculation using myInputOne and myInputTwo

   intermediateResults.Add(something);

   // Continue the calculation using also intermediateResults
   // store results in double[,] finalResults

   var results = new Results();
   results.FinalResult = finalResult;
   results.IntermediateResults = intermediateResults;

   return results;
}

【讨论】:

  • 这很有趣。这与下面 Dasanko 建议的方法相比,哪种方法更好、更有效?谢谢。
  • 我认为这种情况下的效率可以忽略不计,可维护和可读的代码在这里很重要。如果需要,您可以轻松扩展 Results 对象以添加更多属性,而不必更改声明。此外,调用代码更具可读性,因为您使用的是有意义的命名良好的属性。元组最好在内部使用。
【解决方案2】:

您可以将返回类型更改为Tuple&lt;T1, T2&gt;

所以方法声明会变成

public Tuple<List<double>, double[,]> methodOne(Dictionary<string, double> myInputOne, List<double> myInputTwo)

反过来,你会回来

return new Tuple<List<double>, double[,]>(intermediateResults, finalResults);

但是,这取决于您希望如何使用返回的数据。如果这不仅仅是一个短期的结果,那么您最好按照 Ralph Willgoss 的建议制作一个自定义对象。

【讨论】:

  • 谢谢。与 Ralph Willgoss 在另一个答案中建议的方法相比,这种方法有什么优势?
  • 如果您有返回结果的私有方法,最好在内部使用元组,然后将结果聚合到公共类中以在公共方法上公开。
  • 这是主观的,但我更喜欢返回元组,因为我知道它会是短暂/临时的值,可能会被用于其他东西然后被丢弃 - 对我来说,它感觉不那么堵塞而不是一次性创建结构或类。
【解决方案3】:

其他提供的答案的一个选项是out-关键字。在你的情况下:

public double[,] methodOne(Dictionary<string, double> myInputOne, 
    List<double> myInputTwo, out List<double> intermediateResults)
{
    intermediateResults= new List<double>();
    double[,] finalResults= new double[rows, cols];

    // Do some calculation using myInputOne and myInputTwo

    intermediateResults.Add(something);

    // Continue the calculation using also intermediateResults
    // store results in double[,] finalResults

    return results ;
}

用法:

List<double> intermediateResults;
double[,] finalResults = methodOne(someDictionary, someList, out intermediateResults);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2011-01-09
    • 2013-12-24
    • 1970-01-01
    • 2010-09-30
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多