English 中文(简体)
返回多个值
原标题:
  • 时间:2008-12-31 19:21:22
  •  标签:

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

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

然而,稍后我需要每个页面的信息——例如它是否已验证,页面分辨率,彩色/黑白等等。我可以创建另一个函数并运行几乎与之前函数相同的结果集,并获取该信息。

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; }
}

"Hello, how are you?" 你好,你好吗? Definition: A greeting commonly used to inquire about another person's well-being or state of mind.

DocumentInfo GetDocumentInfo(int DocumentId);

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

最佳回答

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

首先,随着设计的变化,您的返回数据可能会发生变化。将此数据封装在对象中可以让您在不更改对象接口的情况下修改所携带的内容以及方法如何操作这些数据。显然,您的数据对象不应该实现接口;最多只能拥有最小接口的基类,然后传递基类的引用。

第二,你可能会发现你的数据变得非常复杂,需要对其进行验证。不要把这个验证放在类的所有方法中,直接将其包装在数据类中。责任单一等等。

问题回答

看起来你需要大量的数据输出。最后一个选项应该是不错的,并且是可扩展的。如果你想要(简化 Dictionary<,> 的使用),你可以再封装一些东西,但是由于 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 就足够了。





相关问题
热门标签