2009-07-08 7 views
16

私はこの質問をするのが恥ずかしいですが、長い間Cプログラマとして、おそらく私はC#でこれを行う最善の方法を知らないと感じています。C#で2つのリストを返す最も良い方法は何ですか?

カスタムタイプ(List<MyType>)の2つのリストを返す必要があるメンバ関数があります。これらのリストのうちの2つのみの戻り値が常にあることを私は事前に知っています。

明白なオプションは次のとおりです。

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

または

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

はどちらも非最適であると思われます。

これを改善する方法についてのご意見はありますか?

最初の方法では、2つのリストのみが返され、2番目のリストは戻り値ではなく参照を使用することが構文で明確になりません。

答えて

31

まず、それはおそらくout、ないrefでなければなりません。

第2に、2つのリストを含む型を宣言して返すことができます。

第三に、あなたは一般的な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 <>型があります。 –

+12

TとUを使ってアイテムを指定しているのが分かります。 2タプル以上のタプルがあれば、T-U-V-W ...またはT-U-P-L-Eに行きますか? :) –

+5

@マーク:考えなかった。それについて考える前に、私はF#に切り替えることを考えるでしょう! –

24

戻り、この:すべての

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

両方を保持し、それを関数の出力として返す単純な構造を作成しますか?

4

あなたの最初の提案は2つのリストではありません。それはリストのリストです。

2番目のオプションは意図しているとおりですが、refの代わりにoutキーワードを使用するように変更して、メソッドの呼び出し元があなたの意図を知るようにすることができます。

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

あなたはいくつかのオプションがあります:あなたが述べたようにあなたは、アウトまたはREFパラメータを使用することができます

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

リストが順番に無意味である場合にはペアを使用します。これは、1つのリストが他のリストより意味がある場合には、良いオプションです。クライアントが鍵を知っている、またはそれらをルックアップするために仕事をしたいと考えています場合は、辞書を使用することができ

:私の目には

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

それとも、ほとんどの「正しい」ソリューションを、完全を期すためと一貫性は、2つのリストを保持する単純なデータコンテナクラスを作成することです。これにより、消費者は、強く型付けされ、良好に静的にコンパイルされた(読み込み:インテリセンス対応の)戻り値を扱うことができます。クラスはメソッドのすぐ隣にネストすることができます。

関連する問題