using System;
using System.Linq;
class Foo
{
public int A { get; set; }
public int B { get; set; }
}
public class Test
{
public static void Main()
{
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.ToString()).ToArray());
Console.WriteLine("A = {0}, Bs = [ {1} ] ", aKey, bList);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKCmNsYXNzIEZvbwp7CiAgcHVibGljIGludCBBIHsgZ2V0OyBzZXQ7IH0KICBwdWJsaWMgaW50IEIgeyBnZXQ7IHNldDsgfQp9CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CiAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdDxGb28+KCl7CiAgICAgICAgICAgICAgICBuZXcgRm9vKCl7IEEgPSAxLCBCID0gMSB9LAogICAgICAgICAgICAgICAgbmV3IEZvbygpeyBBID0gMSwgQiA9IDIgfSwKICAgICAgICAgICAgICAgIG5ldyBGb28oKXsgQSA9IDIsIEIgPSAzIH0sCiAgICAgICAgICAgICAgICBuZXcgRm9vKCl7IEEgPSAyLCBCID0gNCB9LAogICAgICAgICAgICAgICAgbmV3IEZvbygpeyBBID0gMSwgQiA9IDUgfSwKICAgICAgICAgICAgICAgIG5ldyBGb28oKXsgQSA9IDMsIEIgPSA2IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHZhciBncm91cHMgPSBsaXN0CiAgICAJCS5TZWxlY3QoKGYsIGkpID0+IG5ldwogICAgCQl7CiAgICAgICAgCQlPYmogPSBmLAogICAgICAgIAkJTmV4dCA9IGxpc3QuRWxlbWVudEF0T3JEZWZhdWx0KGkgKyAxKSwKICAgICAgICAJCVByZXYgPSBsaXN0LkVsZW1lbnRBdE9yRGVmYXVsdChpIC0gMSkKICAgIAkJfSkKICAgIAkJLlNlbGVjdCh4ID0+IG5ldwogICAgCQl7CiAgICAgICAgCQlBID0geC5PYmouQSwKICAgICAgICAJCXguT2JqLAogICAgICAgIAkJQ29uc2VjdXRpdmUgPSAoeC5OZXh0ICE9IG51bGwgJiYgeC5OZXh0LkEgPT0geC5PYmouQSkKICAgICAgICAgICAgICAgICAgIAkJICAgfHwgKHguUHJldiAhPSBudWxsICYmIHguUHJldi5BID09IHguT2JqLkEpCiAgICAJCX0pCiAgICAJCS5Hcm91cEJ5KHggPT4gbmV3IHsgeC5Db25zZWN1dGl2ZSwgeC5BIH0pOwoKICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFiR3JvdXAgaW4gZ3JvdXBzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgYUtleSA9IGFiR3JvdXAuS2V5LkE7CiAgICAgICAgICAgICAgICB2YXIgYkxpc3QgPSBzdHJpbmcuSm9pbigiLCIsIGFiR3JvdXAuU2VsZWN0KHggPT4geC5PYmouQi5Ub1N0cmluZygpKS5Ub0FycmF5KCkpOwogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkEgPSB7MH0sIEJzID0gWyB7MX0gXSAiLCBhS2V5LCBiTGlzdCk7CiAgICAgICAgICAgIH0KCX0KfQ==