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.
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
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.
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.
Avevo lasciato due != ;)
E' una specie di NullObject pattern ;)
C'è qualcosa che mi sfugge...io non vedo la difficoltà mi sa.
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 ;)
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.
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:
:( :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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.