using System.Collections.Generic;
public override string ToString() {
return Id + ": " + Name + " - " + Age;
public delegate object Func2<in T>(T arg);
public static void Main()
Func<MyNode, bool> isChild = x => x.Age < 18;
Func<MyNode, bool> isAdult = x => x.Age >= 18;
Func<MyNode, bool> isAgeOk = isAdult;
Func<MyNode, IComparable> sortByName = x => x.Name;
Func<MyNode, IComparable> sortByAge = x => x.Age;
Func<MyNode, IComparable> sortById = x => x.Id;
var currentSort = sortByAge;
var LstNodes = new List<MyNode>()
{Id = 1, Name = "name1", Age = 31}, new MyNode()
{Id = 2, Name = "name2", Age = 2}, new MyNode()
{Id = 3, Name = "name3", Age = 23}, new MyNode()
{Id = 4, Name = "name4", Age = 34}, new MyNode()
{Id = 5, Name = "name5", Age = 5}, new MyNode()
{Id = 6, Name = "name6", Age = 6}, new MyNode()
{Id = 7, Name = "name7", Age = 7}, new MyNode()
{Id = 8, Name = "name8", Age = 8}, };
var result = LstNodes.Where(isAgeOk).Distinct().OrderBy(currentSort).ToList();
foreach (var entry in result) {
Console.WriteLine(entry.ToString());