using System;
using System.Linq;
public class Test
{
public static void Main()
{
var products = new [] {
new { Name="A", Priority="1", Value=default(string) },
new { Name="A", Priority="2", Value=default(string) },
new { Name="A", Priority="3", Value="10" },
new { Name="A", Priority="4", Value=default(string) },
new { Name="A", Priority="5", Value="20" },
new { Name="A", Priority="6", Value=default(string) },
new { Name="B", Priority="1", Value="15" },
new { Name="B", Priority="2", Value=default(string) },
new { Name="B", Priority="3", Value="10" },
new { Name="B", Priority="4", Value=default(string) },
new { Name="B", Priority="5", Value="20" },
new { Name="B", Priority="6", Value=default(string) },
};
var result = products
.GroupBy(p => p.Name)
.SelectMany (grp =>
grp.OrderBy(p => p.Priority) // sort by priority
.SkipWhile(p => p.Value == null) // skip null entries at beginnig
.Reverse() // reverse
.SkipWhile(p => p.Value == null) // skip null entries at end
.Reverse() // reverse back to normal
.Where(p => p.Value == null) // then find null entries
);
foreach (var product in result)
{
Console.WriteLine("Product(Name=" + product.Name + ",Priority=" + product.Priority + ",Value=" + product.Value + ")");
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uTGlucTsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKdmFyIHByb2R1Y3RzID0gbmV3IFtdIHsKCW5ldyB7IE5hbWU9IkEiLCBQcmlvcml0eT0iMSIsIFZhbHVlPWRlZmF1bHQoc3RyaW5nKSB9LAoJbmV3IHsgTmFtZT0iQSIsIFByaW9yaXR5PSIyIiwgVmFsdWU9ZGVmYXVsdChzdHJpbmcpIH0sCgluZXcgeyBOYW1lPSJBIiwgUHJpb3JpdHk9IjMiLCBWYWx1ZT0iMTAiIH0sCgluZXcgeyBOYW1lPSJBIiwgUHJpb3JpdHk9IjQiLCBWYWx1ZT1kZWZhdWx0KHN0cmluZykgfSwKCW5ldyB7IE5hbWU9IkEiLCBQcmlvcml0eT0iNSIsIFZhbHVlPSIyMCIgfSwKCW5ldyB7IE5hbWU9IkEiLCBQcmlvcml0eT0iNiIsIFZhbHVlPWRlZmF1bHQoc3RyaW5nKSB9LAoJbmV3IHsgTmFtZT0iQiIsIFByaW9yaXR5PSIxIiwgVmFsdWU9IjE1IiB9LAoJbmV3IHsgTmFtZT0iQiIsIFByaW9yaXR5PSIyIiwgVmFsdWU9ZGVmYXVsdChzdHJpbmcpIH0sCgluZXcgeyBOYW1lPSJCIiwgUHJpb3JpdHk9IjMiLCBWYWx1ZT0iMTAiIH0sCgluZXcgeyBOYW1lPSJCIiwgUHJpb3JpdHk9IjQiLCBWYWx1ZT1kZWZhdWx0KHN0cmluZykgfSwKCW5ldyB7IE5hbWU9IkIiLCBQcmlvcml0eT0iNSIsIFZhbHVlPSIyMCIgfSwKCW5ldyB7IE5hbWU9IkIiLCBQcmlvcml0eT0iNiIsIFZhbHVlPWRlZmF1bHQoc3RyaW5nKSB9LAp9OwoKdmFyIHJlc3VsdCA9IHByb2R1Y3RzCgkuR3JvdXBCeShwID0+IHAuTmFtZSkKCS5TZWxlY3RNYW55IChncnAgPT4KCQlncnAuT3JkZXJCeShwID0+IHAuUHJpb3JpdHkpICAgICAgICAgICAgLy8gc29ydCBieSBwcmlvcml0eQoJCQkuU2tpcFdoaWxlKHAgPT4gcC5WYWx1ZSA9PSBudWxsKSAgICAgLy8gc2tpcCBudWxsIGVudHJpZXMgYXQgYmVnaW5uaWcKCQkJLlJldmVyc2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldmVyc2UKCQkJLlNraXBXaGlsZShwID0+IHAuVmFsdWUgPT0gbnVsbCkgICAgIC8vIHNraXAgbnVsbCBlbnRyaWVzIGF0IGVuZAoJCQkuUmV2ZXJzZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBiYWNrIHRvIG5vcm1hbAoJCQkuV2hlcmUocCA9PiBwLlZhbHVlID09IG51bGwpICAgICAgICAvLyB0aGVuIGZpbmQgbnVsbCBlbnRyaWVzCgkpOwoKZm9yZWFjaCAodmFyIHByb2R1Y3QgaW4gcmVzdWx0KQp7CglDb25zb2xlLldyaXRlTGluZSgiUHJvZHVjdChOYW1lPSIgKyBwcm9kdWN0Lk5hbWUgKyAiLFByaW9yaXR5PSIgKyBwcm9kdWN0LlByaW9yaXR5ICsgIixWYWx1ZT0iICsgcHJvZHVjdC5WYWx1ZSArICIpIik7Cn0KCX0KfQ==