IGroupingの「Value」プロパティを取得します


141

私はのようなデータ構造を持っています

public DespatchGroup(DateTime despatchDate, List<Products> products);

そして私はやろうとしている...

var list = new List<DespatchGroup>();

foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate))
{
    // group.Values is not correct... how do I write this?
    list.Add(new DespatchGroup(group.Key, group.Values);
}

IGroupingグループ内のデータレコードに実際にアクセスする方法がわからないので、私は明らかに理解していません。


1
編集(Rev2)は、どの回答とも一致しないため、あまり建設的ではありませんでした。
Sunny Patel、2014年

回答:


170

グループの実装はIEnumerable<T>-では、一般的な場合、単に呼び出しforeachを超えますgroup。で、この場合、あなたが必要があるのでList<T>

list.Add(new DespatchGroup(group.Key, group.ToList());

したがって、基本的には、質問の本質に従っている場合は、値を単に引き出すのではなく、それをリストに変換するためのオーバーヘッドが多くなることvalueと同等ToList()です
Coops

2
@CodeBlendリストが必要なため、オーバーヘッドが大きくなります。Values彼らが想像したような財産があったら、彼らはしなければならないでしょうgroup.Values.ToList()。逆に、リストの代わりに列挙可能なものを受け入れた場合new DespatchGroup(group.Key, group)は機能します。オーバーヘッドは、DespachGroupIGroupingの動作方法ではなく、定義によるものです。
Jon Hanna

35

それ自体値のシーケンスであるValuesため、プロパティなどはありません。この場合に必要なのは、そのシーケンスをリストに変換することだけです。IGrouping<T>IEnumerable<T>

list.Add(new DespatchGroup(group.Key, group.ToList());

6
必要に応じて、IEnumerableに変換することもできますgroup.AsEnumerable()
Mateen Ulhaq 2016年

22

選択したグループについては、

var selectedGroupValues=selectedGroup.SelectMany(x=>x);

2
ありがとう!.SelectIGrouping <>が再び返されるのとは異なり.SelectMany、グループ化された値のタイプのIEnumerableが返されます。これは私が求めていたものです。
K0D4

これは、(潜在的に)複数のグループが選択されている場合にのみ使用します。(別名IEnumerable<IGrouping<key,DespatchGroup>>)。それ以外の場合は、を使用するtoList()か、単ににキャストしIEnumerable<DespatchGroup>ます。
アップルアップル

21

関連するヒント-他の回答が述べたように、使用できる特定のインデックスにアクセスする必要がある場合、グループ化はIEnumerableですgroup.ElementAt(i)

これはおそらく多くの人には明らかですが、うまくいけば少数の人に役立つでしょう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.