Avatar billede hulla Novice
20. juli 2011 - 08:02 Der 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:

Input
(int : string)
1 : 12
1 : 23
1 : 72
3 : 34
3 : 38
4 : 22

Output
int , string
1 : 12,23,72
3 : 34,38
4 : 22

Det kan lade sig gøre med en masse kode, men vil gerne have en lille fiks metode til det :-)
Avatar billede hulla Novice
20. juli 2011 - 09:17 #1
Jeg har selv fundet en lidt bedre løsning nu, den ser sådan ud:

while (reader.Read())
{
  currentId = Convert.ToInt32(reader["Id"]);

  if (oldId != currentId && count > 0)
  {
    res.Add(new KeyValuePair<int, string>(oldId,      lineIds.Substring(1)));
    lineIds = string.Empty;
  }

  lineIds += "," + reader["LineId"];
  oldId = currentId;
  count++;
}             
res.Add(new KeyValuePair<int, string>(currentId, lineIds.Substring(1)));

Nogen bedre?
Avatar billede Syska Mester
20. juli 2011 - 09:42 #2
Har ingen VS foran mig.

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.

mvh
Avatar billede arne_v Ekspert
20. juli 2011 - 19:38 #3
Implementering af #2:

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();
        }
    }
}
Avatar billede arne_v Ekspert
20. juli 2011 - 19:49 #4
Og en version uden LINQ:

using System;
using System.Collections.Generic;

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();
        }
    }
}
Avatar billede janus_007 Nybegynder
21. juli 2011 - 01:21 #5
Det kan laves uhyre nemt i TSQL med coalesce, kunne det være brugbart for dig?
Avatar billede Melsvik Nybegynder
21. juli 2011 - 09:31 #6
En anden version uden LINQ


var dic = new Dictionary<int, List<string>>();
while (reader.Read())
{
  id = Convert.ToInt32(reader["Id"]);
  data = reader["LineId"];

  if(!dic.ContainsKey(id))
  {
    dic.Add(id,new List<string>());
  }
  dic[id].Add(data );
}

var outPut = new List<KeyValuePair<int, string>>();
foreach (var d in dic)
{
  outPut.Add(new KeyValuePair<int, string>(d.Key,String.Join(",", d.Value)));
}
Avatar billede arne_v Ekspert
11. september 2011 - 23:41 #7
hulla?
Avatar billede hulla Novice
28. september 2011 - 11:04 #8
Jeg mangler et svar Arne :-)
Avatar billede arne_v Ekspert
28. september 2011 - 14:29 #9
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester