1

私は次のようなクエリごとにgroupbyを実装しました

var query = (from a in Main
             group a by a.Parent into g
             where g.Count() >= 0
             select new
             {
                 parent= g.Key,
                 Name= g.Select(y => y.name).Count(),
                 Contact= g.Select(x => x.contact).Count(),
                 Friends= g.Select(z => z.friends).Count(),
             }).ToArray();

メインのように、次のようなレコードを取得しています

In first list  ====>      Parent="1"
                          name="2"
                          contact=0
                          friends=0 

In second List ===>       Parent="2"
                          name="2"
                          contact=0
                          Friends=0        

しかし、group by queryを使用しているときは、この方法で値を取得しています

parent="1",Name="2",Contact="2",Friends="2" 

parent="2",Name="3",Contact="2",Friends="2"

また、各フィールドの数も必要です。

だから私がどこで間違ったことをしたのか教えてください、

前もって感謝します。

4

2 に答える 2

0

まず、グループ化後にToArray()を使用せず、同じことを期待してください。

通常のSelect-Whereクエリを実行している場合、返されるのはIEnumerableであり、これを配列に変換します。

group byを実行する場合の違いは、戻りタイプがIGroupingであり、期待しているのと同じ配列に変換されないことです。

グループ化する場合は、出力を別の方法で処理する必要があります。


提案:

int nameCount = 0;
int contactCount = 0;
int friendCount = 0;

Main.GroupBy(x => x.Parent).ToDictionary(pair => pair.Key, pair => {
   nameCount += pair.Count(y => y.Name);
  //etc. for the rest of the counters.
}

このように、グループ化の要素を反復処理するセレクター機能を使用して、各要素の連絡先、友達、名前を合計します。私はあなたの質問の文脈を理解したと思います。

于 2013-02-01T07:59:40.883 に答える
0
g.Select(x => x.friends).Count(),

Count演算子の意味を混乱させているかもしれません。合計ではなく、クエリによって投影された要素のCountを計算します。したがって、が2つの要素を含む場合、プロパティの値に関係なく、常に2を返します。gg.Select(x => x.anything)anything

プロパティから予測された値の合計を返すことを意味していると思います。friendsその場合は、次を使用する必要があります。

g.Sum(x => x.friends),
于 2013-02-01T08:01:54.883 に答える