PDA

View Full Version : [concettuale]scrittura di un metodo


RaouL_BennetH
21-04-2007, 11:55
Ciao a tutti :)

Avrei da risolvere un problemuccio che però credo di non riuscire ad inquadrare.

Su un'ipotetica griglia, ho 5 celle; La quinta cella deve darmi un risultato che è la differenza di alcuni valori.

Le mie possibili condizioni sono:

1) Ho solo le prime due celle che contengono un valore e quindi la quinta cella deve darmi la differenza di: cella2 - cella1

2) Ho solo la terza e quarta cella che contengono un valore e quindi la quinta cella deve darmi la differenza di: cella4 - cella1

3) Ho tutte e quattro le celle che contengono un valore e quindi la quinta cella deve darmi: (cella2 - cella1) + (cella4 - cella3)

Questo problema l'ho risolto con una serie infinita di "if - else", ma non mi piace assolutamente. Dato che è un'operazione che devo svolgere spesso su questo programma, intuisco che devo astrarre il concetto in maniera migliore.

Come posso fare?

Grazie mille.

RaouL.

okay
21-04-2007, 12:14
Ciao a tutti :)

Avrei da risolvere un problemuccio che però credo di non riuscire ad inquadrare.

Su un'ipotetica griglia, ho 5 celle; La quinta cella deve darmi un risultato che è la differenza di alcuni valori.

Le mie possibili condizioni sono:

1) Ho solo le prime due celle che contengono un valore e quindi la quinta cella deve darmi la differenza di: cella2 - cella1

2) Ho solo la terza e quarta cella che contengono un valore e quindi la quinta cella deve darmi la differenza di: cella4 - cella1

3) Ho tutte e quattro le celle che contengono un valore e quindi la quinta cella deve darmi: (cella2 - cella1) + (cella4 - cella3)

Questo problema l'ho risolto con una serie infinita di "if - else", ma non mi piace assolutamente. Dato che è un'operazione che devo svolgere spesso su questo programma, intuisco che devo astrarre il concetto in maniera migliore.

Come posso fare?

Grazie mille.

RaouL.

fai dei cicli for:

bool ok=false;
a=0
for i=0 i<5 i++
if(cella[i]>0)
a++;

if(a==4)
ok=true;//hai tutte le 4 celle con un valore quindi calcoli
if(ok){
cella[5]=(cella2 - cella1) + (cella4 - cella3)
}else{
for i=0 i<5 i++
for j=i+1; <5 i++
if(cella[j]>0 && cella[i]>0)
cella[5]=cella[j]-cella[i];
}


perlomeno per quanto hai scritto...

un'appunto è che sull'else cella[5] viene sovrascritto... per ora!... se i valori di cella i e j sono >0

RaouL_BennetH
21-04-2007, 12:23
più o meno corrisponde all'idea che mi ero fatto, solo che non so perchè non mi convince :(

Attualmente ho abbozzato così:




private void GetTotal(MyGridCellEventArgs e)
{
DateTime dt1, dt2, dt3, dt4;
bool b1, b2, b3, b4;


//prima condizione, le prime due celle contengono un valore e le altre no
if(grid.Rows[e.RowIndex].Cells[0].Value != null && grid.Rows[e.RowIndex].Cells[1].Value != null)
{
b1 = DateTime.TryParse(grid.Rows[e.RowIndex].Cells[0].Value.ToString(), out dt1);
b2 = DateTime.TryParse(grid.Rows[e.RowIndex].Cells[1].Value.ToString(), out dt2);

TimeSpan ts = dt2.SubTract(dt1);
grid.Rows[e.RowIndex].Cells[4].Value = ts.ToString();
}

//seconda condizione: solo la terza e quarta cella contengono un valore
if(grid.Rows[e.RowIndex].Cells[2].Vale != null && grid.Rows[e.RowIndex].Cells[3].Value != null)
{
b3 = ....
b4 = ....
TimeSpan ts = .....
}

//terza condizione: tutte e quattro le celle contengono un valore
{
b1 = .... out dt1;
b2 = .... out dt2;
b3 = .... out dt3;
b4 = .... out dt4;

TimeSpan ts1 = dt2 - dt1;
TimeSpan ts2 = dt4 - dt3;
TimeSpan total = ts2 + ts1;
}
//end of horror code pretty candidate to the daily wtf

cionci
21-04-2007, 13:24
Fai un metodo che ti fa la differenza fra due celle:

TimeSpan GetSubTotal(MyGridCellEventArgs e, int first, int second)
{
DateTime dt1, dt2;
if(grid.Rows[e.RowIndex].Cells[first].Value == null || grid.Rows[e.RowIndex].Cells[second].Value == null)
return new TimeSpan(0); //non so come esprimerlo, ritorna un time span in cui la differenza è zero
DateTime.TryParse(grid.Rows[e.RowIndex].Cells[first].Value.ToString(), out dt1);
DateTime.TryParse(grid.Rows[e.RowIndex].Cells[second].Value.ToString(), out dt2);

return dt2.SubTract(dt1);
}

private void GetTotal(MyGridCellEventArgs e)
{
TimeSpan total = GetSubTotal(e, 0, 1) + GetSubTotal(e, 2, 3);
grid.Rows[e.RowIndex].Cells[4].Value = ts.ToString();
}

Potrebbe andare ?

RaouL_BennetH
21-04-2007, 13:40
Potrebbe andare ?

Ecco, questo si che significa leggere nel pensiero ! :)

Si, credo che come concetto sia esattamente ciò che cercavo !


Grazie mille :)

RaouL.

MEMon
21-04-2007, 13:46
Ma se fai un metodo per leggere il valore della cella e uno per farne il totale non fai prima?:

int getCellValue(int n){
int value=grid.Rows[e.RowIndex].Cells[n].Vale
if(value!=null) return value;
else return 0;
}

int doCalc(int cell1, int cell2, int cell3, int cell4){
return (cell2-cell1)+(cell4-cell3);
}


Non va bene?
Corrisponde a quello che hai detto.

cionci
21-04-2007, 13:46
Avevo lasciato due != ;)

E' una specie di NullObject pattern ;)

MEMon
21-04-2007, 13:49
C'è qualcosa che mi sfugge...io non vedo la difficoltà mi sa.

cionci
21-04-2007, 13:57
C'è qualcosa che mi sfugge...io non vedo la difficoltà mi sa.
Guarda, io ho fatto circa la stessa cosa che hai fatto te...soltanto che il contenuto delle celle non è un int ;)

MEMon
21-04-2007, 13:58
aaaaaa ecco

RaouL_BennetH
21-04-2007, 14:02
Ma se fai un metodo per leggere il valore della cella e uno per farne il totale non fai prima?:

int getCellValue(int n){
int value=grid.Rows[e.RowIndex].Cells[n].Vale
if(value!=null) return value;
else return 0;
}

int doCalc(int cell1, int cell2, int cell3, int cell4){
return (cell2-cell1)+(cell4-cell3);
}


Non va bene?
Corrisponde a quello che hai detto.

Se fossero interi o double o float, andrebbe bene anche così.

Il fatto è che i valori che ho sono di tipo DateTime e per fare le differenze o addizioni necessito di un oggetto di tipo TimeSpan, il quale, non ammette lo stesso tipo di aritmetica dei tipi classici.

MEMon
21-04-2007, 14:04
Sisi ho capito, magari se lo specificavi anche nel primo post lo capivo prima :)

RaouL_BennetH
21-04-2007, 14:13
Sisi ho capito, magari se lo specificavi anche nel primo post lo capivo prima :)

:( :ops:

MEMon
21-04-2007, 14:14
:( :ops:

noooooo spero che non mi hai frainteso, volevo dire che io parto subito per la tangente, mi sono poi accorto dopo che ti serviva un qualcosa di concettuale! :p

^TiGeRShArK^
22-04-2007, 00:11
EDIT
non avevo capito una mazza :D