【问题标题】:C# Complex Return TypesC# 复杂返回类型
【发布时间】:2011-06-06 23:52:06
【问题描述】:

我是 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 的所有对象组合在一起,以便以后在其他代码中循环更容易。

【问题讨论】:

  • 能否提供一些示例代码,以便我们做出更具体的设计指导?
  • 每件事都有太多的方法。举一个你正在尝试的例子,有人可能会给出你认为在其他地方也适用的答案。
  • @sixlettervariables 我加了一个例子
  • 你能把名字贴在(int id, string name, int[] nums)上吗,它在其他地方用过吗?
  • @Henk 在这种情况下,只是这一个功能,但3个左右的地方可能会使用结果

标签: c#


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试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 授权)。

    【讨论】:

    • 这种情况下泛型的适用性并不明显。
    • 是的,总比没有好,直到戴维斯为他的问题提供更多细节。
    • @Davis,好的,通过你的例子添加了具体的解决方案。
    【解决方案3】:

    您的函数应该类似于b = F(a),其中ab 在您的设计中是具有意义的类型。

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

    【讨论】:

      【解决方案4】:

      在您的具体示例中,您应该有一个处理这些属性的具体类型,以及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()
                  };
      

      【讨论】:

        猜你喜欢
        • 2014-06-27
        • 2013-05-26
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 2011-01-24
        • 2013-12-16
        相关资源
        最近更新 更多