在C#中返回两个列表的最佳方法是什么?

时间:2009-07-08 16:25:28

标签: c# list coding-style

我几乎不好意思问这个问题,但作为很长一段时间的C程序员,我觉得也许我不知道在C#中做到这一点的最好方法。

我有一个成员函数,我需要返回两个自定义类型列表(List<MyType>),我事先知道我将始终只返回其中两个列表的返回值。

显而易见的选择是:

public List<List<MyType>> ReturnTwoLists();

public void ReturnTwoLists(ref List<MyType> listOne, ref List<myType> listTwo);

两者似乎都不是最佳的。

有关如何改善此事的任何建议吗?

第一种方法并没有在语法中明确表示只返回2个列表,第二种方法使用引用而不是返回值,这看起来非c#。

5 个答案:

答案 0 :(得分:31)

首先,应该是out,而不是ref

其次,您可以声明并返回包含两个列表的类型。

第三,你可以声明一个通用Tuple并返回一个实例:

class Tuple<T,U> {
   public Tuple(T first, U second) { 
       First = first;
       Second = second;
   }
   public T First { get; private set; }
   public U Second { get; private set; }
}

static class Tuple {
   // The following method is declared to take advantage of
   // compiler type inference features and let us not specify
   // the type parameters manually.
   public static Tuple<T,U> Create<T,U>(T first, U second) {
        return new Tuple<T,U>(first, second);
   }
}

return Tuple.Create(firstList, secondList);

您可以针对不同数量的项目扩展此想法。

答案 1 :(得分:24)

返回:

public class MyTwoLists {
    public List<MyType> ListOne {get;set;}
    public List<MyType> ListTwo {get;set;}
}

答案 2 :(得分:4)

你的第一个建议不是两个清单。这是一份清单。

第二个选项会按照您的意图执行,但您可能希望将其更改为使用out关键字而不是ref,这样您的方法的调用者就会知道您正在做什么的意图。

public void ReturnTwoLists(out List<MyType> listOne, out List<myType> listTwo);

答案 3 :(得分:3)

您有几个选择:

如果列表按顺序无意义,则使用一对:

 public Pair<List<MyType>,List<MyType> ReturnTwoLists()
 {
        return new Pair(new List<MyType(), new List<MyType());
 }

如您所述,您可以使用 out ref 参数。如果一个列表比另一个列表更有意义,这是一个很好的选择。

如果客户端知道密钥,或者想要查找工作,您可以使用字典:

 public Dictionary<string,List<MyType> ReturnTwoLists()
 {
        Dictionary<string,List<MyTpe>> d = new Dictionary<string,List<MyType>>();
        d.Add("FirstList",new List<MyType>());
        d.Add("SecondList",new List<MyType>());
        return new Dictionary()(new List<MyType(), new List<MyType());
 }

或者,对于完整性和一致性而言,我眼中最“正确”的解决方案是创建一个简单的数据容器类来保存这两个列表。这为消费者提供了强类型,良好的静态编译(读取:intellisense-enabled)返回值。该类可以嵌套在该方法旁边。

答案 4 :(得分:0)

创建一个包含两者的简单结构并将其作为函数的输出返回?