C#复杂返回类型

  • 本文关键字:返回类型 复杂 c#
  • 更新时间 :
  • 英文 :


我是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)一样,其中ab是设计中有用的类型。

特殊类型(如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()
            };

最新更新