fork(1) download
  1. using System;
  2. using System.Linq;
  3.  
  4. public class Test
  5. {
  6. public static void Main()
  7. {
  8. var products = new [] {
  9. new { Name="A", Priority="1", Value=default(string) },
  10. new { Name="A", Priority="2", Value=default(string) },
  11. new { Name="A", Priority="3", Value="10" },
  12. new { Name="A", Priority="4", Value=default(string) },
  13. new { Name="A", Priority="5", Value="20" },
  14. new { Name="A", Priority="6", Value=default(string) },
  15. new { Name="B", Priority="1", Value="15" },
  16. new { Name="B", Priority="2", Value=default(string) },
  17. new { Name="B", Priority="3", Value="10" },
  18. new { Name="B", Priority="4", Value=default(string) },
  19. new { Name="B", Priority="5", Value="20" },
  20. new { Name="B", Priority="6", Value=default(string) },
  21. };
  22.  
  23. var result = products
  24. .GroupBy(p => p.Name)
  25. .SelectMany (grp =>
  26. grp.OrderBy(p => p.Priority) // sort by priority
  27. .SkipWhile(p => p.Value == null) // skip null entries at beginnig
  28. .Reverse() // reverse
  29. .SkipWhile(p => p.Value == null) // skip null entries at end
  30. .Reverse() // reverse back to normal
  31. .Where(p => p.Value == null) // then find null entries
  32. );
  33.  
  34. foreach (var product in result)
  35. {
  36. Console.WriteLine("Product(Name=" + product.Name + ",Priority=" + product.Priority + ",Value=" + product.Value + ")");
  37. }
  38. }
  39. }
Success #stdin #stdout 0.06s 38360KB
stdin
Standard input is empty
stdout
Product(Name=A,Priority=4,Value=)
Product(Name=B,Priority=2,Value=)
Product(Name=B,Priority=4,Value=)