3

たとえば、次のプロパティを持つオブジェクトのリストがある場合

No  Grouper Sorter
1     X       3
2     X       2
3     X       1
4     Y       3
5     Y       2
6     Y       5
7     Z       4

結果にオブジェクト 3 (最高のソーターの X)、No 5 (最高のソーターの Y)、および No 7 (最高のソーターの Z、ここには他に選択肢はありません) が含まれるようにします。

No  Grouper Sorter
3     X       1
5     Y       2
7     Z       4

たとえばLinqを使用して、これを行うにはどうすればよいですか? Linq を使用しないクリーンでシンプルなソリューションがあるかどうかも気にしません。

4

2 に答える 2

3
var result = list.GroupBy(x=>x.Grouper)
                .Select(x=>x.OrderBy(y=>y.Sorter).First())
                .ToList();
于 2013-05-09T07:40:51.673 に答える
2

したがって、グルーパーでグループ化し、各グループをソーターで並べ替えて、最初の結果を保持ます。リンクを使用すると、何かをつなぎ合わせることができ、最終的には以下のようになります。

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Thing> things = new List<Thing>()
            {
                new Thing(){ No = 1, Grouper = 'X', Sorter = 3  },
                new Thing(){ No = 2, Grouper = 'X', Sorter = 2  },
                new Thing(){ No = 3, Grouper = 'X', Sorter = 1  },
                new Thing(){ No = 4, Grouper = 'Y', Sorter = 3  },
                new Thing(){ No = 5, Grouper = 'Y', Sorter = 2  },
                new Thing(){ No = 6, Grouper = 'Y', Sorter = 5  },
                new Thing(){ No = 7, Grouper = 'Z', Sorter = 4  }
            };

            var test = from thing in things
                       group thing by thing.Grouper into thingGroup
                       select thingGroup.OrderBy(tg => tg.Sorter).First();

            foreach (var thing in test)
            {
                Console.WriteLine(thing);
            }

            Console.ReadKey();
        }
    }

    class Thing
    {
        public int No { get; set; }
        public char Grouper { get; set; }
        public int Sorter { get; set; }

        public override string ToString()
        {
            return string.Format("No: {0}, Grouper: {1}, Sorter: {2}",
                                 No, Grouper, Sorter);
        }
    }
}

出力:

No: 3, Grouper: X, Sorter: 1
No: 5, Grouper: Y, Sorter: 2
No: 7, Grouper: Z, Sorter: 4
于 2013-05-09T07:44:09.377 に答える