2

次のオブジェクトの一般的なリストがあるとします。

public class Supermarket
{
    public string Brand { get; set; }
    public string Suburb { get; set; }
    public string State { get; set; }
    public string Country { get; set; }
}

したがってList<Supermarket>、さまざまな値を持つこれらのオブジェクトの多くが取り込まれた を使用して、次のことを試みています。

  1. に含まれるオブジェクトのスーパーセットから個別のSuburbプロパティを選択します(このスーパーセットには 20 の個別の郊外が含まれているとします)。SupermarketList<Supermarket>

  2. 上記の郊外の個別のリストを、LINQ クエリによって取得された集計およびカウントされた郊外の別のセットに結合して、別の小さいリストにします。List<Supermarket>

私のスーパーセットの個別のアイテムは次のとおりです。

"Blackheath"
"Ramsgate"
"Penrith"
"Vaucluse"
"Newtown"

そして、集計クエリの結果は次のとおりです。

"Blackheath", 50
"Ramsgate", 30
"Penrith", 10

私は彼らに参加して手に入れたい

"Blackheath", 50
"Ramsgate", 30
"Penrith", 10
"Vaucluse", 0
"Newtown", 0

これが私がこれまでに試したことです:

var results = from distinctSuburb in AllSupermarkets.Select(x => x.Suburb).Distinct()
                select new
                {
                    Suburb = distinctSuburb,
                    Count = (from item in SomeSupermarkets
                            group item by item.Suburb into aggr
                            select new
                            {
                                Suburb = aggr.Key,
                                Count = aggr.Count()
                            } into merge
                            where distinctSuburb == merge.Suburb
                            select merge.Count).DefaultIfEmpty(0)
                } into final
                select final;

Stack Overflow が素晴らしいリソースとして投稿するのはこれが初めてですが、これに対する解決策をまとめることができないようです。

御時間ありがとうございます

編集:OKだから、最初の投稿からしばらくしてこれを解決しました。私が見逃していたのは、 へ.ElementAtOrDefault(0)の呼び出しの後に への呼び出しをチェーンすることだけでした.DefaultIfEmpty(0)。アニが指摘したよう.First()に代わりに使用することも確認しました。正しいクエリは次のとおりです。.DefaultIfEmpty(0)

var results = from distinctSuburb in AllSupermarkets.Select(x => x.Suburb).Distinct()
                select new
                {
                    Suburb = distinctSuburb,
                    Count = (from item in SomeSupermarkets
                            group item by item.Suburb into aggr
                            select new
                            {
                                Suburb = aggr.Key,
                                Count = aggr.Count()
                            } into merge
                            where distinctSuburb == merge.Suburb
                            select merge.Count).DefaultIfEmpty(0).ElementAtOrDefault(0)
                } into final
                select final;

最後に: Ani のコード スニペットを実行し、正常に実行されることを確認したので、両方のアプローチが機能し、元の質問が解決されました。

4

1 に答える 1