20. juli 2011 - 08:02Der er
8 kommentarer og 1 løsning
Hjælp til sorterings-algoritme
Hej
Jeg har brug for en lidt speciel sorterings-algoritme, og er kommet ud i noget værre roderi, og vil høre om nogen kan finde en genial måde at gøre det på.
Opgaven: Fra min datasource får jeg en reader med x antal records der hver består af 2 felter (Id, og LineIdString) Disse data input skal laves om til et output der bedst illustreres ved følgende eksempel:
Jeg ville nok læse det hele ud, derefter lave en groupby med linq på ID ... og så lave en string.Join på de elementer som er resultatet af din group by.
using System; using System.Collections.Generic; using System.Linq;
namespace E { public class Data1 { public int Id { get; set; } public int Val { get; set; } } public class Data2 { public int Id { get; set; } public List<int> Vals { get; set; } } public class Data3 { public int Id { get; set; } public string Val { get; set; } } public class Program { public static List<Data1> DatabaseSimulate() { List<Data1> res = new List<Data1>(); res.Add(new Data1{ Id = 1, Val = 12 }); res.Add(new Data1{ Id = 1, Val = 23 }); res.Add(new Data1{ Id = 1, Val = 72 }); res.Add(new Data1{ Id = 3, Val = 34 }); res.Add(new Data1{ Id = 3, Val = 38 }); res.Add(new Data1{ Id = 4, Val = 22 }); return res; } public static List<Data2> Aggregate(List<Data1> lst) { return (from elm in lst group elm by elm.Id into g select new Data2{ Id = g.Key, Vals = g.Select(r => r.Val).ToList() }).ToList();
} public static List<Data3> Stringify(List<Data2> lst) { return lst.Select(r => new Data3{ Id = r.Id, Val = String.Join(",", r.Vals) }).ToList(); } public static void Main(string[] args) { List<Data1> lst1 = DatabaseSimulate(); foreach(Data1 d in lst1) { Console.WriteLine(d.Id + " " + d.Val); } List<Data2> lst2 = Aggregate(lst1); foreach(Data2 d in lst2) { Console.WriteLine(d.Id + " " + String.Join(",", d.Vals)); } List<Data3> lst3 = Stringify(lst2); foreach(Data3 d in lst3) { Console.WriteLine(d.Id + " " + d.Val); } Console.ReadKey(); } } }
namespace E { public class Data1 { public int Id { get; set; } public int Val { get; set; } } public class Data2 { public int Id { get; set; } public List<int> Vals { get; set; } } public class Data3 { public int Id { get; set; } public string Val { get; set; } } public class Program { public static List<Data1> DatabaseSimulate() { List<Data1> res = new List<Data1>(); res.Add(new Data1{ Id = 1, Val = 12 }); res.Add(new Data1{ Id = 1, Val = 23 }); res.Add(new Data1{ Id = 1, Val = 72 }); res.Add(new Data1{ Id = 3, Val = 34 }); res.Add(new Data1{ Id = 3, Val = 38 }); res.Add(new Data1{ Id = 4, Val = 22 }); return res; } public static List<Data2> Aggregate(List<Data1> lst) { List<Data2> res = new List<Data2>(); foreach(Data1 d in lst) { Data2 o = res.Find(r => r.Id == d.Id); if(o == null) { o = new Data2{ Id = d.Id, Vals = new List<int>() }; res.Add(o); } o.Vals.Add(d.Val); } return res; } public static List<Data3> Stringify(List<Data2> lst) { List<Data3> res = new List<Data3>(); foreach(Data2 d in lst) { res.Add(new Data3{ Id = d.Id, Val = String.Join(",", d.Vals) }); } return res; } public static void Main(string[] args) { List<Data1> lst1 = DatabaseSimulate(); foreach(Data1 d in lst1) { Console.WriteLine(d.Id + " " + d.Val); } List<Data2> lst2 = Aggregate(lst1); foreach(Data2 d in lst2) { Console.WriteLine(d.Id + " " + String.Join(",", d.Vals)); } List<Data3> lst3 = Stringify(lst2); foreach(Data3 d in lst3) { Console.WriteLine(d.Id + " " + d.Val); } Console.ReadKey(); } } }
var outPut = new List<KeyValuePair<int, string>>(); foreach (var d in dic) { outPut.Add(new KeyValuePair<int, string>(d.Key,String.Join(",", d.Value))); }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.