注::この回答の最初の部分は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()})
をとにかく:あなたは週間/数のペアのリストを望んでいた場合、あなたは何をする必要があると思い
週焼いたケーキの
- 数
- 週販売のケーキの数
- 週
ごとに焼けケーキの数... WHEリストの各要素は、{Week: 3, Count: 22}
のようになります。
Tuple
を使用して、週/カウントのペアを格納できます。 タイプがSystem.DateTime.Week
の場合、それはちょうどint
なので、適切なTuple
はTuple<int, int>
となります。したがって、List
(またはIList
、ICollection
、さらにはIEnumerable
秒)を返すことになります。
[それはあなたが与えられた「一週間」のための「カウント」をルックアップするためにこれらのリストを使用しようとするかもしれないことを私打つ - List
Tuple<int, int>
のではなく、Dictionary<int, int>
を作成するには、その場合には、それがより便利かもしれませんがs。その場合は、最後のSelect
をToDictionary()
コールに置き換えることができます。]
とにかく、これらのリストの3つの(または辞書)を方法から戻す方法の問題があります。いくつかのオプションがあります:
- リストを集約するオブジェクト(配列、別のリスト、別のタプル、さらには独自の型)を返します。
- 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);
}
ベストアンサーは、匿名のタイプを使用することではありません。 C#7では、少なくともアプリケーション内ではタプル型を使用します。それはあなたのための選択肢ですか? –
オブジェクトタイプ –
を使用すると、これらのリストはどのように作成されますか?返されたリストはどのように使用する予定ですか? – Enigmativity