c# - Most efficient to find items in multiple list POCO and merge then in master list -


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