@@ -94,21 +94,21 @@ private Operand SMALL(List<Operand> arg)
9494 {
9595 if ( arg . Count < 2 ) return throwError ( "SMALL中参数不足" , new List < Operand > ( ) ) ;
9696 var list = arg [ 0 ] . GetNumberList ( ) . OrderBy ( q => q ) . ToList ( ) ;
97- return new Operand ( OperandType . NUMBER , list [ arg [ 1 ] . IntValue - 1 ] ) ;
97+ return new Operand ( OperandType . NUMBER , list [ arg [ 1 ] . IntValue - 1 ] ) ;
9898 }
9999
100100 private Operand LARGE ( List < Operand > arg )
101101 {
102102 if ( arg . Count < 2 ) return throwError ( "LARGE中参数不足" , new List < Operand > ( ) ) ;
103- var list = arg [ 0 ] . GetNumberList ( ) . OrderByDescending ( q=> q ) . ToList ( ) ;
104- return new Operand ( OperandType . NUMBER , list [ arg [ 1 ] . IntValue - 1 ] ) ;
103+ var list = arg [ 0 ] . GetNumberList ( ) . OrderByDescending ( q => q ) . ToList ( ) ;
104+ return new Operand ( OperandType . NUMBER , list [ arg [ 1 ] . IntValue - 1 ] ) ;
105105 }
106106
107107 private Operand FISHERINV ( List < Operand > arg )
108108 {
109109 if ( arg . Count < 1 ) return throwError ( "FISHER中参数不足" , new List < Operand > ( ) ) ;
110110 var x = arg [ 0 ] . NumberValue ;
111- var n = ( Math . Exp ( 2 * x ) - 1 ) / ( Math . Exp ( 2 * x ) + 1 ) ;
111+ var n = ( Math . Exp ( 2 * x ) - 1 ) / ( Math . Exp ( 2 * x ) + 1 ) ;
112112 return new Operand ( OperandType . NUMBER , n ) ;
113113 }
114114
@@ -183,54 +183,55 @@ private Operand EXPONDIST(List<Operand> arg)
183183 #region SUMIF COUNTIF
184184 private Operand AVERAGEIF ( List < Operand > arg )
185185 {
186- throw new NotImplementedException ( ) ;
186+ if ( arg . Count < 2 ) return throwError ( "SUMIF中参数不足" , new List < Operand > ( ) ) ;
187+ var dbs = arg [ 0 ] . GetNumberList ( ) ;
188+ List < double > sumdbs = dbs ;
189+ if ( arg . Count == 3 ) sumdbs = arg [ 2 ] . GetNumberList ( ) ;
190+
191+ double sum = 0 ;
192+ int count = 0 ;
193+ if ( arg [ 1 ] . Type == OperandType . NUMBER ) {
194+ count = countif ( dbs , arg [ 1 ] . NumberValue ) ;
195+ sum = count * arg [ 1 ] . NumberValue ;
196+ } else {
197+ double d ;
198+ if ( double . TryParse ( arg [ 1 ] . StringValue . Trim ( ) , out d ) ) {
199+ count = countif ( dbs , arg [ 1 ] . NumberValue ) ;
200+ sum = sumif ( dbs , "=" + arg [ 1 ] . StringValue . Trim ( ) , sumdbs ) ;
201+ } else {
202+ count = countif ( dbs , arg [ 1 ] . StringValue . Trim ( ) ) ;
203+ sum = sumif ( dbs , arg [ 1 ] . StringValue . Trim ( ) , sumdbs ) ;
204+ }
205+ }
206+ return new Operand ( OperandType . NUMBER , sum / count ) ;
207+
187208 }
188209
189210
190211 private Operand SUMIF ( List < Operand > arg )
191212 {
192- throw new NotImplementedException ( ) ;
193-
194213 if ( arg . Count < 2 ) return throwError ( "SUMIF中参数不足" , new List < Operand > ( ) ) ;
195214 var dbs = arg [ 0 ] . GetNumberList ( ) ;
215+ var sumdbs = dbs ;
216+ if ( arg . Count == 3 ) sumdbs = arg [ 2 ] . GetNumberList ( ) ;
196217 double sum = 0 ;
197218 if ( arg [ 1 ] . Type == OperandType . NUMBER ) {
198219 sum = countif ( dbs , arg [ 1 ] . NumberValue ) * arg [ 1 ] . NumberValue ;
199220 } else {
200221 double d ;
201222 if ( double . TryParse ( arg [ 1 ] . StringValue . Trim ( ) , out d ) ) {
202- sum = countif ( dbs , arg [ 1 ] . NumberValue ) * arg [ 1 ] . NumberValue ;
223+ sum = sumif ( dbs , "=" + arg [ 1 ] . StringValue . Trim ( ) , sumdbs ) ;
203224 } else {
204- // sum = countif (dbs, arg[1].StringValue.Trim());
225+ sum = sumif ( dbs , arg [ 1 ] . StringValue . Trim ( ) , sumdbs ) ;
205226 }
206227 }
207228 return new Operand ( OperandType . NUMBER , sum ) ;
208229 }
209- private double sumif ( List < double > dbs , string s )
210- {
211- Regex re = new Regex ( @"(<|<=|>|>=|=|==|!=|<>) *([-+]?\d+(\.(\d+)?)?)" ) ;
212- if ( re . IsMatch ( s ) == false ) {
213- return 0 ;
214- }
215- var m = re . Match ( s ) ;
216- var d = double . Parse ( m . Groups [ 2 ] . Value ) ;
217- var ss = m . Groups [ 1 ] . Value ;
218- double sum = 0 ;
219230
220- foreach ( var item in dbs ) {
221- if ( compare ( item , d , s ) ) {
222- sum += item ;
223- }
224- }
225- return sum ;
226- }
227231
228232
229233 private Operand COUNTIF ( List < Operand > arg )
230234 {
231- //throw new NotImplementedException();
232-
233-
234235 if ( arg . Count < 2 ) return throwError ( "COUNTIF中参数不足" , new List < Operand > ( ) ) ;
235236 var dbs = arg [ 0 ] . GetNumberList ( ) ;
236237 int count = 0 ;
@@ -247,53 +248,10 @@ private Operand COUNTIF(List<Operand> arg)
247248 return new Operand ( OperandType . NUMBER , count ) ;
248249 }
249250
250- private bool compare ( double a , double b , string ss )
251- {
252- if ( ss == "<" ) {
253- return a < b ;
254- } else if ( ss == "<=" ) {
255- return a <= b ;
256- } else if ( ss == ">" ) {
257- return a > b ;
258- } else if ( ss == ">=" ) {
259- return a >= b ;
260- } else if ( ss == "=" || ss == "==" ) {
261- return a == b ;
262- }
263- return a != b ;
264- }
265251
266- private int countif ( List < double > dbs , string s )
267- {
268- Regex re = new Regex ( @"(<|<=|>|>=|=|==|!=|<>) *([-+]?\d+(\.(\d+)?)?)" ) ;
269- if ( re . IsMatch ( s ) == false ) {
270- return 0 ;
271- }
272- var m = re . Match ( s ) ;
273- var d = double . Parse ( m . Groups [ 2 ] . Value ) ;
274- var ss = m . Groups [ 1 ] . Value ;
275- int count = 0 ;
276252
277- foreach ( var item in dbs ) {
278- if ( compare ( item , d , s ) ) {
279- count ++ ;
280- }
281- }
282- return count ;
283- }
284253
285254
286- private int countif ( List < double > dbs , double d )
287- {
288- int count = 0 ;
289- d = Math . Round ( d , 12 ) ;
290- foreach ( var item in dbs ) {
291- if ( Math . Round ( item , 12 ) == d ) {
292- count ++ ;
293- }
294- }
295- return count ;
296- }
297255
298256 #endregion
299257
@@ -616,26 +574,11 @@ private Operand COUNT(List<Operand> arg)
616574
617575 private Operand AVERAGE ( List < Operand > arg )
618576 {
619- // if (arg.Count < 1) return throwError("AVERAGE中参数不足", new List<Operand>());
577+ if ( arg . Count < 1 ) return throwError ( "AVERAGE中参数不足" , new List < Operand > ( ) ) ;
620578 List < double > list = GetList ( arg ) ;
621579 return new Operand ( OperandType . NUMBER , list . Average ( ) ) ;
622580 }
623581
624- private List < double > GetList ( List < Operand > arg )
625- {
626- List < double > list = new List < double > ( ) ;
627- foreach ( var item in arg ) {
628- if ( item . Type == OperandType . NUMBER ) {
629- list . Add ( item . NumberValue ) ;
630- } else if ( item . Type == OperandType . ARRARY ) {
631- var ls = item . GetNumberList ( ) ;
632- if ( ls == null ) continue ;
633- foreach ( var d in ls ) {
634- list . Add ( d ) ;
635- }
636- }
637- }
638- return list ;
639- }
582+
640583 }
641584}
0 commit comments