C#复杂返回类型

C#复杂返回类型,c#,C#,我是C#新手,有时会发现自己需要为某些函数返回复杂的返回类型。与函数可能接收某些对象并返回该对象的不同视图类似:一些字段被添加,一些字段被删除,等等。其他时候,我可能接收对象列表,并希望返回一些修改对象的列表,以及可能对所有对象进行的一些聚合计算 我可以通过返回C#native类型(比如object[])来完成这类事情,但让object[]成为object[]的对象变得很难看,然后在代码中必须“知道”object[0][1]对应于某个对象 我怀疑创建一个名为FnFooReturn的真正新类是有意

我是C#新手,有时会发现自己需要为某些函数返回复杂的返回类型。与函数可能接收某些对象并返回该对象的不同视图类似:一些字段被添加,一些字段被删除,等等。其他时候,我可能接收对象列表,并希望返回一些修改对象的列表,以及可能对所有对象进行的一些聚合计算

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

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

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

(int id, int num, string name)
(int id, string name, int[] nums)
因此,一些示例数据可能是:

(1, 100, "foo")
(1, 203, "foo")
(2, 400, "bar")
(3, 10, "cat")
我想返回一个对象列表,如:

(int id, int num, string name)
(int id, string name, int[] nums)
看起来像:

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

因此,基本上,它只是原始对象列表的一个不同视图,不同的是它将具有相同id的所有对象组合在一起,以便于以后在其他代码中循环

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

尝试

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();

如果您需要将此逻辑封装到一个方法中,请在列表中使用(并在需要时使用对其进行授权)。

您的函数应该类似于
b=F(a)
,其中
a
b
是设计中的菜单类型


对于特殊类型,比如
Tuple
,空间是有限的,但是如果您发现自己编写了特殊类来容纳一个方法,那么一定是出了问题

在您的特定示例中,您应该有一个处理这些属性的具体类型,以及

后来:

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

你能给我们一些示例代码,让我们做一些更具体的设计指导吗?做每件事的方法太多了。举一个你正在尝试的例子,有人可能会给出一个你认为在其他地方也适用的答案。@sixlettervariables我添加了一个例子,你能给
(int-id,string-name,int[]nums)
,它在其他地方使用吗?@Henk在本例中,就这一个函数,但是大约3个地方可能会使用结果泛型在这种情况下的适用性并不明显。是的,在戴维斯提供更多细节之前,总比没有好。@Davis,好的,通过你的例子添加了具体的解决方案。