Vælge dem der ligger i grupper

Tags:    c# linq net

Hejsa

Jeg har nogle perioder som har nogle værdier, som jeg skal have bygget nogle perioder op efter.

Mit konkrete eksempel er følgende to perioder:

1/5-2015 - 30/06-2015 med værdi 684
1/1-2015 - 31/12-2015 med værdi 735

Det der så har været tanken bag er at den der ligger øverst er den gældende først, og så prioriteret ned derefter.

Så det skal ende med 3 perioder:
1/1-2015 - 30/04-2015 med værdi 684.
1/5-2015 - 30/06-2015 med værdi 735.
1/7-2015 - 31/12-2015 med værdi 684.

For at få noget logisk ud, har jeg taget hver periode og skrevet dato i perioden ind i en dictionary, med dato som key, og værdien som value.

Tanken var så at så ville jeg få en serie med dato'er som alle har værdi 684,
så efterfølgende en serie med dato'er som alle har værdi 735,
så til sidst en serie med dato'er som alle har værdi 684 igen.

Det skal så ende i 3 perioder som jeg havde i tankerne at lave med LINQ ved at selecte dem med værdi 684, og så med 735, men problemet her kommer så at den jo ikke tager højde for min logiske sans der siger at jeg vil have dem som ligger ved siden af hinanden, så når de afbryddes i sekvensen skal det blive til en ny periode.

Nu er det så svært for mig at se hvordan jeg lige løser det, udover at løbe datoerne igennem, og se når værdien skifter og så oprette en ny periode når de skifter. Er det virkeligt den bedste måde at løse det på?



2 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Jeg har svært ved at forstå helt præcist problemstillingen - eller rettere hvad er dit input og dit ønskede output.

Er inputtet altid kun 2 perioder; det lyder det ikke som om? Er hele "året" altid dækket? Eller sagt på en anden måde er en periode altid inden for intervallet af en anden periode? F.eks. som 1/5-2015-30/06-2015 ligger fuldstændig inden for 1/1-2015 - 31/12-2015.

På grund af dette er vigtigt at vide om der kun er 2 perioder i inputtet, for ellers hvad sker der hvis der er mere end 2 perioder der overlapper? Hvis ikke, er alle perioderne (undtagen en som dækker alle) adskilte, dvs. de overlapper ikke?

Baseret på dit eksempel virker det som om at for inputtet er det ligemeget hvilken periode der er forbundet med hvilken værdi? Kun rækkefølgen af værdierne har betydning her; rækkefølgen af perioder kunne være ligemeget. F.eks er 684 i input forbundet med maj-juni mens det i outputtet forholder sig omvendt.




Jeg har svært ved at forstå helt præcist problemstillingen - eller rettere hvad er dit input og dit ønskede output.

Er inputtet altid kun 2 perioder; det lyder det ikke som om? Er hele "året" altid dækket? Eller sagt på en anden måde er en periode altid inden for intervallet af en anden periode? F.eks. som 1/5-2015-30/06-2015 ligger fuldstændig inden for 1/1-2015 - 31/12-2015.

På grund af dette er vigtigt at vide om der kun er 2 perioder i inputtet, for ellers hvad sker der hvis der er mere end 2 perioder der overlapper? Hvis ikke, er alle perioderne (undtagen en som dækker alle) adskilte, dvs. de overlapper ikke?

Baseret på dit eksempel virker det som om at for inputtet er det ligemeget hvilken periode der er forbundet med hvilken værdi? Kun rækkefølgen af værdierne har betydning her; rækkefølgen af perioder kunne være ligemeget. F.eks er 684 i input forbundet med maj-juni mens det i outputtet forholder sig omvendt.


Kan starte med at sige jeg har selv løst det, fordi det viste sig at data var totalt upålidelige - så kan ikke vide noget som helst.
Havde håbet jeg kunne lave noget LINQ select med nogle nye objekter og noget distinct, men var ikke muligt - så det bliver kørt i hånden.

Problemet var at jeg får et udefineret antal perioder, med som kan overlappe flere gange. Den øverste skal derfor dække den periode der ikke er taget, og sådan fremdeles.

Et eksempel:

01/02 - 15/05 med værdi 684
10/05 - 08/06 med værdi 354
20/01 - 30/08 med værdi 711
01/03 - 30/05 med værdi 321
01/05 - 10/10 med værdi 455
04/04 - 05/05 med værdi 655
10/01 - 31/12 med værdi 477
01/01 - 03/03 med værdi 722

Her skal så fyldes hele året ud med perioder, som ikke allerede er dækket.
Så første periode er ikke dækket og giver derfor
01/02 - 15/05 med værdi 684
Dette giver listen:
01/02 - 15/05 med værdi 684

Næste periode er dækket af noget af perioden, så derfor bliver den del der er dækket fjernet og giver
16/05 - 08/06 med værdi 354
Dette giver listen:
01/02 - 15/05 med værdi 684
16/05 - 08/06 med værdi 354

Næste periode er dækket både før og efter og giver derfor en opdeling i to dele:
20/01 - 31/01 med værdi 711
09/06 - 30/08 med værdi 711
Dette giver listen:
01/02 - 15/05 med værdi 684
16/05 - 08/06 med værdi 354
20/01 - 31/01 med værdi 711
09/06 - 30/08 med værdi 711

Næste periode er fuldt dækket og springes over (01/03 - 30/05 med værdi 321)

Næste periode er delvist dækket og deles op
01/09 - 10/10 med værdi 455
Dette giver listen:
01/02 - 15/05 med værdi 684
16/05 - 08/06 med værdi 354
20/01 - 31/01 med værdi 711
09/06 - 30/08 med værdi 711
01/09 - 10/10 med værdi 455

Næste periode er fuldt dækket og springes over (04/04 - 05/05 med værdi 655)

Næste periode dækker både før og efter og skal derfor deles i to
10/01 - 31/01 med værdi 477
11/10 - 31/12 med værdi 477
Dette giver listen:
01/02 - 15/05 med værdi 684
16/05 - 08/06 med værdi 354
20/01 - 31/01 med værdi 711
09/06 - 30/08 med værdi 711
01/09 - 10/10 med værdi 455
10/01 - 31/01 med værdi 477
11/10 - 31/12 med værdi 477

Sidste periode giver følgende
01/01 - 09/01 med værdi 722
Dette giver listen:
01/02 - 15/05 med værdi 684
16/05 - 08/06 med værdi 354
20/01 - 31/01 med værdi 711
09/06 - 30/08 med værdi 711
01/09 - 10/10 med værdi 455
10/01 - 31/01 med værdi 477
11/10 - 31/12 med værdi 477
01/01 - 09/01 med værdi 722

Som det ses så kommer perioderne ikke i rækkefølge, og overlapper gerne hinanden.
Så de skal splittes så man dækker det som ikke er dækket, og så bagefter sorteres så de kommer i rækkefølge for året.



t