digitalmars.D - Sorting array with different order
- "Grzeogorz =?UTF-8?B?xYF1c3pjemVrIg==?= <grzegorz piklus.pl> (40/41) Aug 07 2013 I'm writing small web server to serve data as JSON. This data
- bearophile (11/12) Aug 07 2013 Such questions are better asked in D.learn newsgroup.
I'm writing small web server to serve data as JSON. This data could be sorted based on various parameters (order and field to sort). In this example I will use only 2 classes (but I need serve 10-20 classes and each class have 5-10 attributes): class Port { int number; Host[] host; } class Host { string macAddress; string ipAddress; } I have idea to use this struct: struct Sort { string order = "desc"; // Sort order - DESC/ASC string sort_by; // Filed to sort by } To create an associative array with sort function: static this(){ portSortMethods[ Sort( "desc", "number" ) ] = &sort!( "a.numberb.number", SwapStrategy.unstable, Port[] );portSortMethods[ Sort( "asc", "number" ) ] = &sort!( "a.number < b.number", SwapStrategy.unstable, Port[] ); hostSortMethods[ Sort( "desc", "macAddress" ) ] = &sort!( "a.macAddress > b.macAddress", SwapStrategy.unstable, Host[] ); hostSortMethods[ Sort( "asc", "macAddress" ) ] = &sort!( "a.macAddress < b.macAddress", SwapStrategy.unstable, Host[] ); hostSortMethods[ Sort( "desc", "ipAddress" ) ] = &sort!( "a.ipAddress > b.ipAddress", SwapStrategy.unstable, Host[] ); hostSortMethods[ Sort( "asc", "ipAddress" ) ] = &sort!( "a.ipAddress < b.ipAddress", SwapStrategy.unstable, Host[] ); } And write function like this for Hosts: Hosts[] sortHosts( Host[] collection, string order, string by ) { auto sortMethod = hostsSortMethods[ Sort( "desc", "macAddress ) ]; return sortMethod( collection ).release(); } But I have problem with type of portSortMethod and hostSortMethod. I will be glad if someone could help me with my problem.
Aug 07 2013
Grzeogorz Ćuszczek:I will be glad if someone could help me with my problem.Such questions are better asked in D.learn newsgroup. Every time you instantiate the sort function with different template arguments, you generate a different type. So you could use a variant, or probably better to find a different solution. You could store just the arguments of the sort template, like the string "a.ipAddress < b.ipAddress" or the equivalent lambda, and later use it as arguments to instantiate the sort when you need it. Bye, bearophile
Aug 07 2013