したがって、基本的には、同じA
値を持ち、連続しているものをグループ化する必要があります。
オブジェクトのリストを、前/次の要素を含む匿名型に変換する必要があります。Selects
より赤くするために2つ使用しました。次に、2 つの要素が連続しているかどうか (隣接するインデックス) を確認する必要があります。これで、必要なGroupBy
値とbool
.
あなたのオブジェクト:
var list = new System.Collections.Generic.List<Foo>(){
new Foo(){ A = 1, B = 1 },
new Foo(){ A = 1, B = 2 },
new Foo(){ A = 2, B = 3 },
new Foo(){ A = 2, B = 4 },
new Foo(){ A = 1, B = 5 },
new Foo(){ A = 3, B = 6 }
};
クエリ:
var groups = list
.Select((f, i) => new
{
Obj = f,
Next = list.ElementAtOrDefault(i + 1),
Prev = list.ElementAtOrDefault(i - 1)
})
.Select(x => new
{
A = x.Obj.A,
x.Obj,
Consecutive = (x.Next != null && x.Next.A == x.Obj.A)
|| (x.Prev != null && x.Prev.A == x.Obj.A)
})
.GroupBy(x => new { x.Consecutive, x.A });
結果を出力します。
foreach (var abGroup in groups)
{
int aKey = abGroup.Key.A;
var bList = string.Join(",", abGroup.Select(x => x.Obj.B));
Console.WriteLine("A = {0}, Bs = [ {1} ] ", aKey, bList);
}
これが実際のデモです: http://ideone.com/fXgQ3