using System;
using System.Collections.Generic;
using System.Linq;
class LinqGroupDemo
{
static public void Main(string[] args)
{
var query =
from column in GetSource()
group column by new {column.LocId, column.SecId} into g
orderby g.Key.LocId, g.Key.SecId
select new
{
LocId = g.Key.LocId,
SecId = g.Key.SecId,
Columns = g
};
foreach (var key in query)
{
Console.WriteLine("LocId:{0}, SecId:{1}",
key.LocId,
key.SecId);
foreach (var column in key.Columns)
{
Console.WriteLine(" StartElevation:{0}, EndElevation:{1}",
column.StartElevation,
column.EndElevation);
}
}
}
static private List<Column> GetSource()
{
return new List<Column>
{
new Column { LocId = 1 , SecId = 1, StartElevation = 0, EndElevation = 160 },
new Column { LocId = 1 , SecId = 1, StartElevation = 160, EndElevation = 320 },
new Column { LocId = 1 , SecId = 2, StartElevation = 320, EndElevation = 640 },
new Column { LocId = 2 , SecId = 1, StartElevation = 0, EndElevation = 160 },
new Column { LocId = 2 , SecId = 2, StartElevation = 160, EndElevation = 320 }
};
}
}
public class Column
{
public int LocId { get; set; }
public int SecId { get; set; }
public double StartElevation { get; set; }
public double EndElevation { get; set; }
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpjbGFzcyBMaW5xR3JvdXBEZW1vCnsKICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgdmFyIHF1ZXJ5ID0KICAgICAgICAgICAgZnJvbSBjb2x1bW4gaW4gR2V0U291cmNlKCkKICAgICAgICAgICAgZ3JvdXAgY29sdW1uIGJ5IG5ldyB7Y29sdW1uLkxvY0lkLCBjb2x1bW4uU2VjSWR9IGludG8gZwogICAgICAgICAgICBvcmRlcmJ5IGcuS2V5LkxvY0lkLCBnLktleS5TZWNJZAogICAgICAgICAgICBzZWxlY3QgbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExvY0lkID0gZy5LZXkuTG9jSWQsCiAgICAgICAgICAgICAgICBTZWNJZCA9IGcuS2V5LlNlY0lkLAogICAgICAgICAgICAgICAgQ29sdW1ucyA9IGcKICAgICAgICAgICAgfTsKCiAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiBxdWVyeSkKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJMb2NJZDp7MH0sIFNlY0lkOnsxfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleS5Mb2NJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LlNlY0lkKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb2x1bW4gaW4ga2V5LkNvbHVtbnMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFN0YXJ0RWxldmF0aW9uOnswfSwgRW5kRWxldmF0aW9uOnsxfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uU3RhcnRFbGV2YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uRW5kRWxldmF0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgcHJpdmF0ZSBMaXN0PENvbHVtbj4gR2V0U291cmNlKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IExpc3Q8Q29sdW1uPgogICAgICAgIHsKICAgICAgICAgICAgbmV3IENvbHVtbiB7IExvY0lkID0gMSAsIFNlY0lkID0gMSwgU3RhcnRFbGV2YXRpb24gPSAwLCBFbmRFbGV2YXRpb24gPSAxNjAgfSwKICAgICAgICAgICAgbmV3IENvbHVtbiB7IExvY0lkID0gMSAsIFNlY0lkID0gMSwgU3RhcnRFbGV2YXRpb24gPSAxNjAsIEVuZEVsZXZhdGlvbiA9IDMyMCB9LAogICAgICAgICAgICBuZXcgQ29sdW1uIHsgTG9jSWQgPSAxICwgU2VjSWQgPSAyLCBTdGFydEVsZXZhdGlvbiA9IDMyMCwgRW5kRWxldmF0aW9uID0gNjQwIH0sCiAgICAgICAgICAgIG5ldyBDb2x1bW4geyBMb2NJZCA9IDIgLCBTZWNJZCA9IDEsIFN0YXJ0RWxldmF0aW9uID0gMCwgRW5kRWxldmF0aW9uID0gMTYwIH0sCiAgICAgICAgICAgIG5ldyBDb2x1bW4geyBMb2NJZCA9IDIgLCBTZWNJZCA9IDIsIFN0YXJ0RWxldmF0aW9uID0gMTYwLCBFbmRFbGV2YXRpb24gPSAzMjAgfQogICAgICAgIH07CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBDb2x1bW4KewogICAgcHVibGljIGludCBMb2NJZCB7IGdldDsgc2V0OyB9CiAgICBwdWJsaWMgaW50IFNlY0lkIHsgZ2V0OyBzZXQ7IH0KICAgIHB1YmxpYyBkb3VibGUgU3RhcnRFbGV2YXRpb24geyBnZXQ7IHNldDsgfQogICAgcHVibGljIGRvdWJsZSBFbmRFbGV2YXRpb24geyBnZXQ7IHNldDsgfQp9Cg==