我是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的对象组合在一起,以便以后在其他代码中更容易循环。
答案 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)
类似,其中a
和b
在您的设计中是类似的类型。
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()
};