[ CallMeSaMaster @ 16.03.2009. 14:47 ] @
Pozdrav svima,

imam Dataset, koji u sebi sadrzi podatke kao sto su ime i vriejdnost. Imena se ponavljaju ali vrijednosti ne.

Moze li mi neko reci kako cu iz tog Dataseta da pokupim samo imena koja se ne ponavljaju. Ako se ime ponavlja, vrijednost tre bam samo dodat na postojece ime.

Znaci imam:

OsobaA 4
OsobaA 23
OsobaB 3
OsobaA 5
OsobaB 65
OsobaA 12

Kako da dobijem:

broj jedinstvenih imena,

sve vrijednosti vrijednosti za svako ime, npr.

OsobaA 4,23,5,12
OsobaB, 3,65


Radim u C#...
Poz
[ Igor Gajic @ 16.03.2009. 15:29 ] @
Jedno resenje sa LINQ-om:


Code:



string []Posebno = (from r in Tabela2.AsEnumerable()
                              select (string)r["Osoba"]).Distinct().ToArray<string>();

Grupe[] lista = (from r in Tabela2.AsEnumerable()
                        group r by (string)r["Osoba"] into tmp
                        select new Grupe(tmp.Key,
                                                  tmp.Select(s => (int)s["Vrednost"]).ToList<int>())).ToArray<Grupe>();





Pri tome je definisana struktura:

Code:

    struct Grupe
    {
        public string Osoba;
        public List<int> vrednosti;

        public Grupe(string x, List<int> y)
        {
            Osoba= x;
            vrednosti = new List<int>();
            vrednosti.AddRange(y);
        }
    }
[ sallle @ 16.03.2009. 17:22 ] @
Code:

Hashtable tabelaImena = new Hashtable();
foreach (DataRow dr in tabela.Rows)
{
   if (dr.RowState != DataRowState.Deleted)
   {
       if (tabelaImena.ContainsKey((string)dr["ime"])
        {  
             (ArrayList)(tabelaImena[(string)dr["ime"]]).Add((int)dr["vrednost"]);
            }
       else
       {
           tabelaImena.Add((string)dr["ime"],new ArrayList());
           (ArrayList)(tabelaImena[(string)dr["ime"]]).Add((int)dr["vrednost"]);
       }
   }

}
ArrayList rezultat = new ArrayList();
foreach (object key in tabelaImena.Keys)
{
   StringBuilder sb= new StringBuilder((string)tabelaImena[key]);
   foreach (int br in (ArrayList)tabelaImena[key])
   {
      sb.Applend(" "+ br.ToString()+",");
   }
   rezultat.Add (sb.Trim(new char[]{','}).ToString());
}

eo jos jedna skica (ne treba .net 3.5). druga foreach petlja bi se mogla izbeci ako bi se u HashTable umesto parova (string, ArrayList), sadrzao parove (string,string)
[ mmix @ 16.03.2009. 20:35 ] @
@Igor, moze to i da se "ulepsa" malo kroz "Linq to DataSet" ;)
[ CallMeSaMaster @ 16.03.2009. 20:54 ] @
Pozdrav,

@salle

moze li jos malo pomoci? Compajler mi javlja gresku na ovoj liniji( i u if i u else diejlu)

(ArrayList)(tabelaImena[(string)dr["ime"]]).Add((int)dr["vrednost"]);

Error 2 'object' does not contain a definition for 'Add'
[ CallMeSaMaster @ 16.03.2009. 21:31 ] @
Ok, ovo sam jednostavno pretvorio u dva dijela i radi. Medjutim javlja se druga greska a to je cast odnosno na ovoj liniji::

StringBuilder sb= new StringBuilder((string)tabelaImena[key]);

Ovaj string cast ne valja, ali ne kontam sta dodje tu? Koji tip?
[ sallle @ 17.03.2009. 00:49 ] @
jes ne valja... sorry

StringBuilder sb = new StringBuilder ((string)key);

a ovaj drugi red sto ti je javljao gresku bi trebalo da stoji verovatno (mrzi me da palim vs):

((ArrayList)(tabelaImena[(string)dr["ime"]])).Add((int)dr["vrednost"]);
[ toxi_programer @ 17.03.2009. 10:07 ] @
Pa zar nije lakše napisati sql (group by) upit koji će vratiti podatke, onako sabrano?
[ mmix @ 17.03.2009. 11:06 ] @
pa distinct je prost, ali agregacija stringova je slaba tacka SQL-a, morao bi da se uradi neki UDF koji bi "sabrao" drugu kolonu za parametar prve kolone i onda bi radilo.


[ CallMeSaMaster @ 18.03.2009. 20:44 ] @
Hvala Salle na odgovoru, radi sve.

@mmix : slazem se sa tobom

@toxi
query koji ja radim je neki customized query language odnosno tzv. A-SQL koji ne podrzava agregatne funkcije, osim count.
Jednostavno moram da se koristim njim, tako da je ovo za mene idealno rijesenje. Sve i da mogu SQL, ne bi bilo bas jednostavno, kao sto mmix rece..

Hvala u svakom slucaju svima
[ Igor Gajic @ 18.03.2009. 21:27 ] @
@mmix

Evo malo lepse:

Code:

Console.WriteLine((from r in Tabela2.AsEnumerable()
                            select r["Osoba"]).Distinct().Count());


(from r in Tabela2.AsEnumerable()
  group r by r["Osoba"] into tmp
  select new {o=tmp.Key,v=tmp.Aggregate("",(av,s)=> {return  av+","+s["Vrednost"];}).Trim(',')})
.ToList()
.ForEach(s => Console.WriteLine(s.o+"  :  "+s.v+Environment.NewLine));