230

この質問にはすでに答えがあります。

public class ConsolidatedChild
{
    public string School { get; set; }
    public string Friend { get; set; }
    public string FavoriteColor { get; set; }
    public List<Child> Children { get; set; }
}

public class Child
{
    public string School { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
    public string Friend { get; set; }
    public string Mother { get; set; }
    public string FavoriteColor { get; set; }
}

上記の2つのクラスを考えて、School、Friend、FavoriteColorの各プロパティでグループ化された、リストからリストを作成するためにLINQを使用したいと思います。これはLINQで可能ですか?

プロパティを無視してください、コードは質問を助けるために書かれています。


2 답변


360

簡単です。

var consolidatedChildren =
    from c in children
    group c by new
    {
        c.School,
        c.Friend,
        c.FavoriteColor,
    } into gcs
    select new ConsolidatedChild()
    {
        School = gcs.Key.School,
        Friend = gcs.Key.Friend,
        FavoriteColor = gcs.Key.FavoriteColor,
        Children = gcs.ToList(),
    };


  • でグループ内にたくさんのプロパティがあるとしましょう。これを実行してからすべてのプロパティを一覧表示するためのよりクリーンな方法はありますか。 - guiomie
  • @guiomie - 私はもっときれいな方法があったとは言いません。オブジェクトを単一の文字列にシリアライズしてそれをグループ化することもできますが、それ以外の場所ではさらにコードが必要になります。だから、私の考えでは、この答えはいくつのプロパティに関係なく最もきれいな方法です。 - Enigmativity
  • @Doppelganger - 私は2つの理由であなたの編集をロールバックしました。最後のコンマを使用する選択(後FavoriteColorそれは合法的な構文であり、それはコードのより簡単なリファクタリングを可能にします。使用の選択gcsのではなくgcグループ化変数も意図的に作成されています。これは「多数のcのグループ」であることを示しています。 - Enigmativity
  • 私はそれがコンパイルされないことを確信して考えました、しかし、あなたは絶対に正しいです。あなたの変数の名前を変更することに関しては、それはちょうど6文字の制限を乗り越えることでした。私は誰かの変数名をめちゃくちゃにしたくありません。とにかく、素晴らしい答えをもう一度ありがとう! - Doppelganger

184

リストを考えます:

var list = new List<Child>()
                {
                    new Child()
                        {School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "John"},
                    new Child()
                        {School = "School2", FavoriteColor = "blue", Friend = "Bob", Name = "Pete"},
                    new Child()
                        {School = "School1", FavoriteColor = "blue", Friend = "Bob", Name = "Fred"},
                    new Child()
                        {School = "School2", FavoriteColor = "blue", Friend = "Fred", Name = "Bob"},
                };

クエリは次のようになります。

var newList = list.GroupBy(x => new {x.School, x.Friend, x.FavoriteColor})
                    .Select(y => new ConsolidatedChild()
                                        {
                                            FavoriteColor = y.Key.FavoriteColor,
                                            Friend = y.Key.Friend,
                                            School = y.Key.School,
                                            Children = y.ToList()
                                        }
                    );

テストコード

foreach(var item in newList)
{
    Console.WriteLine("School: {0} FavouriteColor: {1} Friend: {2}", item.School,item.FavoriteColor,item.Friend);
    foreach(var child in item.Children)
    {
        Console.WriteLine("\t Name: {0}", child.Name);
    }
}

結果:

School: School1 FavouriteColor: blue Friend: Bob
         Name: John
         Name: Fred
School: School2 FavouriteColor: blue Friend: Bob
         Name: Pete
School: School2 FavouriteColor: blue Friend: Fred
         Name: Bob


  • 流暢なインターフェースを好む私たちの人々のために。ちょっとした混乱:同じ変数「x」を使う。どちらのFunc定義でも、新しいユーザーにはあまり明確ではありません。上記の「c」と一致するように変更することをおすすめします。は子で、「gcs」はグループ化された子供たちです。 - Michael Blackburn
  • @jazmatician _再利用するという点であなたに同意しますx混乱するかもしれませんが、変数名の選択に関してはそうではありません。に変更しますxそしてyそれはそれを区別しました。 - Jamiec
  • 変数名も選択できません。実際、これを書いているときに、私は何の「gcs」を見つけるのに苦労しました。作者に意味します。私が思い付くことができた最高のものは< group(of)Cs"でした。とにかく、私はそれが誰かが2つの構文の間の精神的な地図を作るのを簡単にすることを試みることを試みることをそれだけに勧めました。 (構文?構文は、それ自体が複数形である単語の1つです。これは英語なので、なぜ「構文」は複数形に関する構文規則に従うのでしょうか。) - Michael Blackburn
  • 私の正接に答えるために:en.wiktionary.org/wiki/syntax - Michael Blackburn
  • 私はこの意見マイケルに反対します。私の意見では、xは両方の場所で使用されるべきです。あなたが他のHuncと一緒にFuncを使用する時であるべきでない唯一の時は、あなたはyに行くべきです。そうでなければ混乱します。 - Serj Sagan

リンクされた質問


関連する質問

最近の質問