2017-11-06 9 views
-1

私は3つのタイプのリストを持っていますSystem.Collections.Generic.List<<anonymous type: System.DateTime.Week, int Count>>.C#で複数の匿名の型リストを返す最適かつ最適な方法は何ですか?

私のプログラムでは、DBからフェッチされたデータを含むタイプのリストを使用しています。次のように私はSystem.Collections.Generic.List<<anonymous type: System.DateTime.Week, int Count>>.

は、基本的にはこれらのリストのための選択部分があるタイプのものであり、3つの別々のリストを作成しています。このdetailsList使用

detailsList 
    .Where(where_part) 
    .Select(x => x.Week) 
    .GroupBy(x => x.Week) 
    .(x => new { Week = x.Key, Count = x.Count() }) 
    .ToList(); 

にはどうすればいいの方法からこれらのリストを返すことができます最も最適な方法を使用して? この場合、このメソッドの戻り値の型は何ですか?

注:返された後、これらのリストを保持している3つの異なるデータテーブルを入力する必要があるため、これらのリストに再びアクセスしたいと思います。

+2

ベストアンサーは、匿名のタイプを使用することではありません。 C#7では、少なくともアプリケーション内ではタプル型を使用します。それはあなたのための選択肢ですか? –

+0

オブジェクトタイプ –

+0

を使用すると、これらのリストはどのように作成されますか?返されたリストはどのように使用する予定ですか? – Enigmativity

答えて

0

出力と一致するビューモデルを作成し、それを使用してSystem.Collections.Generic.List<YourViewModel>を作成することができます。その後、それを返すことができます。

1

注::この回答の最初の部分はC#6です。 C#7を使用している場合は、最後に説明されているようにC#7のビルトインタプル戻り型を使用できます。


あなたのコード:

detailsList.Where(where_part).Select(x=>x.Week).GroupBy(x=>x.Week).Select(x=>x.Count) 

...匿名型を選択していません。それはIEnumerable<int>を返します。私は質問を理解していれば、あなたは、このような(例を構成する)など3つのリストを、返すようにしたい、

detailsList.Where(where_part).Select(x=>x.Week).GroupBy(x=>x.Week) 
    .Select(x=>new {Week = x.Key, x.Count()}) 

をとにかく:あなたは週間/数のペアのリストを望んでいた場合、あなたは何をする必要があると思い

週焼いたケーキの
  1. 週販売のケーキの数

ごとに焼けケーキの数... WHEリストの各要素は、{Week: 3, Count: 22}のようになります。

Tupleを使用して、週/カウントのペアを格納できます。 タイプがSystem.DateTime.Weekの場合、それはちょうどintなので、適切なTupleTuple<int, int>となります。したがって、List(またはIListICollection、さらにはIEnumerable秒)を返すことになります。

[それはあなたが与えられた「一週間」のための「カウント」をルックアップするためにこれらのリストを使用しようとするかもしれないことを私打つ - ListTuple<int, int>のではなく、Dictionary<int, int>を作成するには、その場合には、それがより便利かもしれませんがs。その場合は、最後のSelectToDictionary()コールに置き換えることができます。]

とにかく、これらのリストの3つの(または辞書)を方法から戻す方法の問題があります。いくつかのオプションがあります:

  1. リストを集約するオブジェクト(配列、別のリスト、別のタプル、さらには独自の型)を返します。
  2. 3つの「out」パラメータを使用します。

Tupleタイプを使用すると、戻り値/出力パラメータのタイプを比較的簡単に宣言できます。この場合には、私はIReadOnlyCollection<Tuple<int, int>>かを使用したいのいずれか...私はちょうどList :-)を使用することがなかったことを除いて...

class CakeInfo 
{ 
    List<Tuple<int, int>> CakesBakedByWeek { get; private set; } 
    List<Tuple<int, int>> CakesSoldByWeek { get; private set; } 
    List<Tuple<int, int>> CakesBurntByWeek { get; private set; } 

    public CakeInfo(
     IEnumerable<Tuple<int, int>> baked, 
     IEnumerable<Tuple<int, int>> sold, 
     IEnumerable<Tuple<int, int>> burnt 
    ) 
    { 
     CakesBakedByWeek = baked.ToList(); 
     CakesSolByWeek = sold.ToList(); 
     CakesBurntByWeek = burnt.ToList(); 
    } 
} 

:個人的に、私はおそらくのような自分自身の戻り値の型を作成したいですIReadOnlyDictionary<int, int>。これを使用するには

、あなたのGetCakeInfo方法は次のようになります。

public CakeInfo GetCakeInfo() 
{ 
    var detailsList = ...; 

    var baked = detailsList.Where(where_part_baked).Select(x=>x.Week).GroupBy(x=>x.Week) 
     .Select(x=>new Tuple<int, int>(x.Key, x.Count())); 

    var sold = detailsList.Where(where_part_sold).Select(x=>x.Week).GroupBy(x=>x.Week) 
     .Select(x=>new Tuple<int, int>(x.Key, x.Count())); 

    var burnt = detailsList.Where(where_part_burnt).Select(x=>x.Week).GroupBy(x=>x.Week) 
     .Select(x=>new Tuple<int, int>(x.Key, x.Count())); 

    return new CakeInfo(baked, sold, burnt); 
} 

を(もちろん、あなたは上記の繰り返しのコードをくくり出すためにヘルパーメソッドを持つことができます)。


C#7

あなたがC#7を使用していた場合は、より簡単のようなタプル戻り値の型を使って、メソッドからの戻り値として、すべての3つのリストを返すことができます:

public (
    List<Tuple<int, int>> baked, 
    List<Tuple<int, int>> sold, 
    List<Tuple<int, int>> burnt 
) GetCakeInfo() 
{ 
    ... 
    return (baked, sold, burnt); 
} 

あなたはそうのように、これを呼びたい:

(List<Tuple<int, int>> baked, List<Tuple<int, int>> sold, List<Tuple<int, int>> burnt) = GetCakeInfo(); 

...または...

var cakeLists = GetCakeInfo(); 
var baked = cakeLists.baked; 
// ... 

多くはである何、あなたはリスト要素の古いTupleタイプではなく、新しいValueTupleタイプを使用することができます。だから:

public (
    List<(int week, int count)> baked, 
    List<(int week, int count)> sold, 
    List<(int week, int count)> burnt 
) GetCakeInfo() 
{ 
    ... 
    return (baked, sold, burnt); 
} 
関連する問題