C#复合返回类型

时间:2011-06-06 14:51:57

标签: c#

我是C#的新手并且发现自己处于某种情况下,有时我必须为某些函数返回复杂的返回类型。就像函数可以接受一些对象并返回该对象的不同视图:添加一些字段,删除一些字段等。有时,我可能会接受一个对象列表并希望返回一些已修改对象的列表,并且可能对所有这些进行汇总计算。

我可以通过返回C#本机类型(如object [])来完成这些事情,但是对象[]的object []然后在代码中必须“知道”该对象[0]变得很难看] [1]对应某事。

我怀疑创建一个名为FnFooReturn的真正新类是有意义的,但是在哪里最有意义的是包含这些类的定义,以便调用该函数的任何地方都可以使用它?

编辑: 一个具体的例子: 我有一个函数Foo,它接受一个对象列表,如:

(int id, int num, string name)

所以一些示例数据可能是:

(1, 100, "foo")
(1, 203, "foo")
(2, 400, "bar")
(3, 10, "cat")

我希望返回一个对象列表,如:

(int id, string name, int[] nums)

看起来像:

[(1, "foo", [100, 103]), (2, "bar", [400]), (3, "cat", [10])]

所以基本上它只是原始对象列表的不同视图,除了它将所有具有相同id的对象组合在一起,以便以后在其他代码中更容易循环。

4 个答案:

答案 0 :(得分:5)

您可以在项目中添加普通类,并在任何您喜欢的地方使用它。

答案 1 :(得分:3)

尝试 LINQ

var items = new[] {
    new { id = 1, num = 100, name = "foo" },
    new { id = 1, num = 203, name = "foo" },
    new { id = 2, num = 400, name = "bar" },
    new { id = 3, num = 10, name = "cat" },
};

var result = items.GroupBy(x => x.id, (k, i) => new { id = k, nums = i.Select(y => y.num).ToArray(), name = i.Select(x => x.name).First() }).ToArray();

如果您需要将此逻辑封装到方法中,请在列表中使用 Extension Method (并根据需要使用 Generics 授权)

答案 2 :(得分:2)

您的功能应该与b = F(a)类似,其中ab在您的设计中是类似的类型。

ad-hoc类型的空间有限,例如Tuple<Customer, decimal>但是如果你发现自己编写了特殊的类来容纳一个方法,那么就会出现问题。

答案 3 :(得分:1)

在您的具体示例中,您应该具有处理这些属性的具体类型,以及utilize LINQ to reinterpret the data in a different "view"

public class Item
{
    public int Id { get; private set; }
    public int Category { get; set; }
    public string Name { get; set; }

    public Item(int id, int category, string name)
    {
        this.Id = id;
        this.Category = category;
        this.Name = name;
    }
}

随后:

var items = new [] { new Item(1, 103, "foo"), ... };

var query = from item in items
            where item.Category != 108 /* example */
            group by item.Id into g
            select new
            {
                Id = g.Key,
                Categories = g.Select(x => x.Category).ToArray()
            };