【问题标题】:Return an object along with a list返回一个对象和一个列表
【发布时间】:2016-08-30 21:12:52
【问题描述】:

在方法中

  1. 计算计数

  2. 还形成了一个列表

我需要将此计数与 c# 中的列表一起返回。关于如何退货的任何建议?

【问题讨论】:

  • 如果计数属于列表,则只需返回列表并在调用者中获取计数。如果 count 不属于列表,则可以将列表作为方法返回类型返回,并将 count 作为 out 参数
  • 您也可以返回Tuple<int, List<Something>>
  • 也可以返回匿名类型return new{ Count = countVar, list=listVar }
  • 返回列表并使用 List.Count 属性检查列表项的计数。

标签: c# .net json list return


【解决方案1】:

你应该avoid using out and ref parameters

我建议创建一个表示输出结果的类型。

public DoSomethingResult DoSomething()
{
    var result = new DoSomethingResult();
    //....
    result.Data = GenerateList();
    result.Count = CalculateCount();
    return result;
}

public class DoSomethingResult
{
    public List<YourType> Data { get; set; }
    public int Count { get; set; }
}

FxCop rule for out parametes.

【讨论】:

  • 这是一个粗体声明:)
  • 我阅读了链接,我们通常不需要使用它们,但不太确定它必须避免的声明。
  • 必须避免使用outref,直到没有其他方法或性能问题。 @HariPrasad
【解决方案2】:

您应该在 C# 中使用 out 关键字。

MSDN 说明。 “当您希望方法返回多个值时,声明 out 方法很有用。这使方法可以选择返回值。”

Here 是 MSDN 文档。

这是一个例子:

public List<YourType> SomeMethodName(out int count)
{
    //Your calculation here
}

【讨论】:

  • 好吧,我认为你可以使用它,但我认为你不应该使用它。这当然是一个品味问题并且非常基于意见,但我认为几乎总是会创建一个糟糕的 api ;)
  • @khlr 感谢您分享您的意见。如果我可以问,你对 out 有什么看法,为什么你不应该使用它?
  • 我尽量避免它,因为我必须处理大量遗留代码,这些代码在一些不适当的情况下被广泛使用。在我看来,如果您调用一个方法并且需要事先为 out 参数声明另一个变量(尽管在这些情况下是 C# 6 brought improvements),那总是很痛苦。此外,如果一个方法具有一个定义的返回值而不是两个(甚至更多......),我认为它是 cleaner 。在@dotctor 建议的这些情况下,我更喜欢返回自定义类型。
  • @khlr 我完全同意为这些情况返回自定义类型。我还阅读了 dotctor 和 John Skeet 给出的帖子中的答案,这非常有趣。
【解决方案3】:

您可以在调用者方法中简单地返回一个List 并获取一个Count。您实际上不需要同时返回两者。

还有兴趣吗?多种选择。

使用out 参数进行计数。

public List<something> DoSomething(out int count)
{
    ....
    count = list.Count();
    return list; 
}

在 cmets 中使用 Tuple

public Tuple<List<something>, int> DoSomething()
{
    ....
    return new Tuple<List<something>, int>(list1, count); 
}

【讨论】:

  • 使用元组是not a good idea here
  • 没错,但只是为了让 OP 知道有一个选项:-)。我真的没有看到任何有效的情况,他首先需要这两个参数。
【解决方案4】:

2 个选项

  1. 使用 out 参数进行计数,返回类型为 List
  2. 使用包含CountList 的元组或自定义类

示例代码:

 public List<Class1> GetData(out int Count)
 { 
   //... 
    //Your Logic with returning list
 }

选项2:

public CustomClass DoSomething()
{
    var data = new CustomClass();
    //....
    data.Data = list;
    data.Count = list.Count();
    return data;
}
public class CustomClass
{
    public List<Class1> Data { get; set; }
    public int Count { get; set; }
}

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2011-06-09
    相关资源
    最近更新 更多