【问题标题】:Returning multiple values返回多个值
【发布时间】:2010-09-29 01:32:51
【问题描述】:

我有一个函数可以识别页面上的坐标,我将它们作为一个返回

Dictionary<int, Collection<Rectangle>> GetDocumentCoordinates(int DocumentId)

但是,稍后我需要有关每个页面的信息 - 如果已验证,页面分辨率是多少,颜色/bw 等。我可以创建另一个函数并运行与前一个函数几乎相同的结果集并获得该信息。

Dictionary<int, PageInfo> GetDocumentAttributes(int DocumentId)

另一种选择是添加一个ref 参数,以便我可以取回这些值。

Dictionary<int, Collection<Rectangle>> GetCoordinates(int DocumentId, ref Dictionary<int, PageInfo> PageAttributes)

另一种选择是创建一个包含字典和页面信息的包含类:

class DocumentInfo
{
    Dictionary<int, Collection<Rectangle>> Coordinates { get; set;}
    Dictionary<int, PageInfo> PageAttributes { get; set; }
}

然后定义:

DocumentInfo GetDocumentInfo(int DocumentId);

我倾向于最后一个选项,但非常感谢您的见解。

【问题讨论】:

    标签: c# function parameters return-value


    【解决方案1】:

    您似乎需要大量数据。最后一个选项应该没问题,并且是可扩展的;你想要的(为了简化Dictionary&lt;,&gt; 的用法),你可以封装更多的东西,但是 C# 不直接支持命名索引属性的事实意味着你需要一些类,除非你只用像这样的方法包装:

    class DocumentInfo {
        Dictionary<int, Collection<Rectangle>> rectangles = ...
        public Collection<Rectangle> GetRectangles(int index) {
            return rectangles[index]; // might want to clone to
                                      // protect against mutation
        }
        Dictionary<int, PageInfo> pages = ...
        public PageInfo GetPageInfo(int index) {
            return pages[index];
        }
    
     }
    

    我不太清楚int 是什么,所以我不能说这是否合理(所以我就不管它了)。

    另外 - 对于第一个选项,您可能不需要 ref - 使用 out 就足够了。

    【讨论】:

    • 命名的、索引的属性很容易实现,无论您使用基于事件的模型还是简单地放入几个 lambda 来处理枚举/索引...
    • 很简单——只是额外的课程;-p
    • @Mark - 感谢您的输入;即使我将另一个答案设置为“正确”,这只是因为我必须选择一个,如果可以的话,我也会标记你的。
    【解决方案2】:

    最后一个选项绝对是最好的。我发现,在获取或返回具有多种含义的复杂数据时,出于多种原因,创建一个复杂类型来封装这些数据是最佳实践。

    首先,您的退货数据可能会随着您的设计改变而改变。将这些数据封装在一个对象中可以让您更改它携带的内容以及您的方法如何操作这些数据,而无需更改对象的接口。显然,您的数据对象不应该实现接口;最多有一个具有最小接口的基类,然后传递对基类的引用。

    其次,您可能会发现您的数据变得复杂到需要对其执行验证的程度。您可以轻松地将其包装在数据类中,而不是在您对这些数据进行操作的类的所有方法中进行此验证。单一职责等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 2018-03-10
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多