2009-07-08 109 views
16

我几乎不好意思问这个问题,但作为一个很长时间的C程序员,我觉得也许我没有意识到在C#中这样做的最好方法。在C#中返回两个列表的最佳方式是什么?

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

明显的选项是:

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

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

两个似乎是最优的。

有关如何改善此问题的任何建议?

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

回答

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); 

您可以扩展这个想法不同数量的项目。

+7

只剩下一个... .NET 4.0有Tuple <>类型。 – 2009-07-08 16:34:58

24

返回此:

所有的
public class MyTwoLists { 
    public List<MyType> ListOne {get;set;} 
    public List<MyType> ListTwo {get;set;} 
} 
0

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

4

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

第二种选择会做你想做的事,但你可能想改变它使用out关键字而不是ref,这样你方法的调用者就会知道你在做什么的意图。

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

您有几种选择:

用一双如果列出顺序是没有意义的:

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

您可以使用裁判参数,正如你所提到。如果一个列表比另一个列表更有意义,这是一个不错的选择。

你可以使用字典如果客户端就知道了密钥,或者想要做的工作,看看他们:

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()); 
} 

或者,最“正确”的解决方案在我的眼里,完整性和一致性,将是创建一个简单的数据容器类来容纳这两个列表。这为消费者提供了强类型,良好的静态编译(读取:智能感知功能)返回值。该类可以嵌套在方法旁边。

相关问题