C#复杂返回类型
本文关键字:返回类型 复杂 | 更新日期: 2023-09-27 17:58:33
我是C#的新手,有时我发现自己不得不为某些函数返回复杂的返回类型。就像函数可能会接收一些对象并返回该对象的不同视图一样:一些字段被添加,一些字段被删除,等等。其他时候,我可能会接收一个对象列表,并希望返回一些修改过的对象的列表,以及可能对所有对象进行的聚合计算。
我可以通过返回C#本机类型(比如object[])来完成这类事情,但如果有object[]的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的对象组合在一起,以便以后在其他代码中更容易循环。
您可以将一个普通类添加到您的项目中,并在任何您喜欢的地方使用它。
尝试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();
如果您需要将此逻辑封装到一个方法中,请在列表中使用扩展方法(如果需要,请使用Generics)。
您的函数应该像b = F(a)
一样,其中a
和b
是设计中有用的类型。
特殊类型(如Tuple<Customer, decimal>
)的空间有限,但如果您发现自己正在编写特殊的类来适应某个方法,则说明出现了问题。
在您的特定示例中,您应该有一个处理这些属性的具体类型,并使用LINQ在不同的"视图"中重新解释数据。
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()
};