i have c# class, lets call item
class. item
class have following properties.
name region value
i have 4 list containing multiple object of type item
. 1 of list master list.
following content of masterlist
name region value global 10 b global 20 c global 30 d global 40 e global 50 f global 60 g global 70 h global 80 global 90 j global 100
following content of usalist
name region value g usa 50 h usa 50 usa 50 j usa 50 usa 50
following content of uklist
name region value uk 20 b uk 20 c uk 20 d uk 20 f uk 20
following content of eulist
name region value eu 30 b eu 30 d ek 30 g ek 30 ek 30
any list can have number of items. master list have items. item can appear once in list. items may or may not sorted (by name) in list.
i want find items lists, assuming master list have items. need find items name & create new list should this.
name globalvalue usavalue ukvalue euvalue 10 50 20 30 b 20 20 30 c 30 20 d 40 20 30 e 50 f 60 20 g 70 50 30 h 80 50 90 50 30 j 100 50
i know can create new class have following properties.
name, globalvalue, usavalue, ukvalue, euvalue
then can start loop go on master list & inside loop, run 3 more loops. 1 usalist, 1 uklist & 1 eulist. ill try find item name , create new list.
but want know efficient way desired result.
demo class & list
public class item { public string name { get; set; } public string region { get; set; } public string value { get; set; } }
list
list<item> masterlist = new list<item>(); masterlist.add(new item {name = "a", region = "global", value = "10"}); masterlist.add(new item {name = "b", region = "global", value = "20"}); masterlist.add(new item {name = "c", region = "global", value = "30"}); masterlist.add(new item {name = "d", region = "global", value = "40"}); masterlist.add(new item {name = "e", region = "global", value = "50"}); masterlist.add(new item {name = "f", region = "global", value = "60"}); masterlist.add(new item {name = "g", region = "global", value = "70"}); masterlist.add(new item {name = "h", region = "global", value = "80"}); masterlist.add(new item {name = "i", region = "global", value = "90"}); masterlist.add(new item {name = "j", region = "global", value = "100"}); list<item> usalist = new list<item>(); usalist.add(new item { name = "g", region = "usa", value = "50" }); usalist.add(new item { name = "h", region = "usa", value = "50" }); usalist.add(new item { name = "i", region = "usa", value = "50" }); usalist.add(new item { name = "j", region = "usa", value = "50" }); usalist.add(new item { name = "a", region = "usa", value = "40" }); list<item> uklist = new list<item>(); uklist.add(new item { name = "a", region = "uk", value = "20" }); uklist.add(new item { name = "b", region = "uk", value = "20" }); uklist.add(new item { name = "c", region = "uk", value = "20" }); uklist.add(new item { name = "d", region = "uk", value = "20" }); uklist.add(new item { name = "f", region = "uk", value = "20" }); list<item> eulist = new list<item>(); eulist.add(new item { name = "a", region = "eu", value = "30" }); eulist.add(new item { name = "b", region = "eu", value = "30" }); eulist.add(new item { name = "g", region = "eu", value = "30" }); eulist.add(new item { name = "g", region = "eu", value = "30" }); eulist.add(new item { name = "i", region = "eu", value = "30" });
in example code provided, add items masterlist instead of other lists, coincidentally, might effective way: concatenating list , using groupby
instead of multiple joins:
var list = (from in masterlist.concat(usalist).concat(uklist).concat(eulist) //concat lists group i.name g //primary group on name let d = (idictionary)g.groupby(si=>si.region).todictionary(gr => gr.key, gr=> gr.sum(v=>int.parse(v.value))) //create dictionary of regions sums values select new {name = g.key, globalvalue = d["global"], usavalue = d["usa"], ukvalue = d["uk"], euvalue = d["eu"]}).tolist();
instead of separate fields, add values dictionary itself. note cast (idictionary)
. implementation of 'idictionary' index behaves different on direct index of generic index: latter throws exception index not in dictionary.
for testing: dotnetfiddle
Comments
Post a Comment