using System.Collections.Generic;
private static readonly Random random = new Random();
private static readonly object syncLock = new object();
public static int RandomNumber(int min, int max)
return random.Next(min, max);
public static List<dynamic> GenerateObjects()
List<dynamic> returnList = new List<dynamic>();
var n = RandomNumber(0, 1000);
for(int i = 1; i < n; i++)
dynamic obj = new ExpandoObject();
obj.wi = RandomNumber(0, 1000);
obj.vi = RandomNumber(0, 1000);
public static dynamic FindMostValuableToCarry(List<dynamic> objs)
dynamic returnObj = objs.First();
if(obj.wi < returnObj.wi && obj.vi > returnObj.vi)
public static void Main()
var objects = GenerateObjects();
var W = RandomNumber(0, 10000);
var mostValuableICanCarry = objects.OrderByDescending(x => x.vi).ThenBy(x => x.wi).ToList();
dynamic millionDollarObj = new ExpandoObject();
millionDollarObj.vi = 1000000;
mostValuableICanCarry.Add(millionDollarObj);
var itemsIChooseToCarry = new List<dynamic>();
var objToCarry = FindMostValuableToCarry(mostValuableICanCarry);
carried += objToCarry.wi;
mostValuableICanCarry.Remove(objToCarry);
itemsIChooseToCarry.Add(objToCarry);
Console.WriteLine(string.Format("I carry {0}/{1} pounds worth {2}$", itemsIChooseToCarry.Sum(x => x.wi), W, itemsIChooseToCarry.Sum(x => x.vi)));