Avatar billede CodingJoe Nybegynder
12. november 2011 - 22:38 Der er 10 kommentarer og
1 løsning

Group By i LINQ

Jeg har en liste af entiteter (List<MinEntitet>). Jeg har fx. 20 elementer i denne liste.

Lad os sige at det er en liste af personer.
public class Person {
public string Country {get;set;}
public string City {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
public int Age {get;set;}
}

Jeg vil gerne gruppere alle dem, der kommer fra samme land og kommer fra samme by. Jeg vil sætte dem ind i en List<Subscriber> klasse, hvor jeg samtidig fanger den laveste alder og den højeste alder.

public class Subscriber {
public string Country {get;set;}
public string City {get;set;}
public int MinAge {get;set;}
public int MaxAge {get;set;}
}

Jeg har problemer med at lave en groupby med to betingelser, dvs. Country og City. Jeg kan sagtens lave den med een betingelse uden problemer, men der skal grupperes på Country og City og som en krølle på det hele, så skal den laveste alder og den højeste alder findes i grupperet data og sættes i Subscriber sammen med Country og City....

Nogen der kan hjælpe derude?
Avatar billede kelo Nybegynder
13. november 2011 - 09:38 #1
Prøv lige den her, jeg har godt nok ikke testet den.

from p in Person
group p by new {p.Country, p.City} into s
    select new {g.Key.Country, g.Key.City, p.Age}
Avatar billede CodingJoe Nybegynder
13. november 2011 - 13:34 #2
med 'g' formoder jeg du mener 's'...prøver lige, men kan ikke se, hvordan du finder max og min alderen...
Avatar billede CodingJoe Nybegynder
13. november 2011 - 13:47 #3
Virker desværre ikke...
Avatar billede platik Nybegynder
13. november 2011 - 17:16 #4
Skal nok finpudses lidt.

Prøv:

var subscribers =
from p in Person
group p by new {p.Country, p.City} into s
select new Subscriber()
                {
                Country = s.Key.Country,
                City = s.Key.City,
                MaxAge = s.Max(x => x.Age)
                MinAge = s.Min(x => x.Min)
                };
Avatar billede platik Nybegynder
13. november 2011 - 17:19 #5
Skulle selvfølgelig være:

MinAge = s.Min(x => x.Age)
Avatar billede CodingJoe Nybegynder
13. november 2011 - 22:01 #6
Tror der er en lille syntaks fejl i dit udtryk. Kan ikke lave en new Subscriber...kan ihvertfald få adgang til dens properties... :(
Avatar billede CodingJoe Nybegynder
13. november 2011 - 22:02 #7
* kan ihvertfald IKKE få adgang til dens properties... :(
Avatar billede CodingJoe Nybegynder
13. november 2011 - 22:05 #8
Av!...fandt en fejl...navne konflikt i min kode...retter lige...tror dit udtryk er helt fint...
Avatar billede CodingJoe Nybegynder
13. november 2011 - 22:20 #9
Det fungerer :)

Tak.

Er det egentligt nemt at neste en if else i linq udtrykket? jeg har fx en lille betingelse at jeg skal spørge på et fx. et FirstName == 'Clark' og hvis det er, så skal maxAge være = 99

Abstraher for logikken i det...det er bare et eksempel på en betingelse...


Send gerne et svar ind så points kan gives...
Avatar billede platik Nybegynder
14. november 2011 - 09:31 #10
Kan godt lade sig gøre, men synes ikke det er for kønt.

MaxAge = s.Max(x => x.FirstName.Equals("Clark") ? 99 : x.Age)

Du kan læse yderligere om ? operatoren her:
http://msdn.microsoft.com/en-us/library/ty67wk28.aspx
Avatar billede CodingJoe Nybegynder
14. november 2011 - 18:52 #11
Kender godt operatoren....havde slet ikke tænkt at den kunne bruges i dette tilfælde :)
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
Kurser inden for grundlæggende programmering

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