2011-09-26 6 views
7

He siguientes entradas:Generar secuencia con valor de paso

double zmin; 
double zmax; 
int count; 
int N; //Total number of element in result array 

I desea generar una secuencia de doble matriz con zmin como primera y zmax como último valor. Pero desde el segundo valor hasta el último, excepto uno, debe ser redondeado por (zmax-zmin)/count.

Ejemplo:

zmin = 1; 
zmax = 10; 
count = 3 

Resultado esperado:

double[] result = { 1, 4, 7, 10} 

Mi intento:

double[] result = Enumerable.Repeat(zmin, N).Select(iv => (iv +(zmax-zmin)/count)).ToArray(); 
+2

Eso no es una descripción del error ... –

Respuesta

9
public static IEnumerable<double> Range(double min, double max, double step) 
{ 
    double i; 
    for (i=min; i<=max; i+=step) 
     yield return i; 

    if (i != max+step) // added only because you want max to be returned as last item 
     yield return max; 
} 
+0

*** *** ejemplos de uso? – Kiquenet

0

Ésta es bueno no sólo para los números, pero para los tipos más complejos como fecha/hora.

El segundo método permite proporcionar el selector de resultados, útil en algunos casos.

public static IEnumerable<TItem> Range<TItem>(
    TItem itemFrom, TItem itemTo, Func<TItem, TItem> itemSelector 
) where TItem : IComparable 
{ 
    // Call to the below method 
    return Range(itemFrom, itemTo, itemSelector, o => o); 
} 

public static IEnumerable<TItem> Range<TItem, TResult>(
    TItem itemFrom, TItem itemTo, Func<TItem, TItem> itemSelector, Func<TItem, TResult> resultSelector 
) where TItem : IComparable 
{ 
    while (true) 
    { 
     yield return resultSelector(itemFrom); 

     if ((itemFrom = itemSelector(itemFrom)).CompareTo(itemTo) > 0) 
      break; 
    } 
} 

Uso:

Range(1, 10, o => o + 3); 
1 
4 
7 
10 
Range(
    DateTime.Now, 
    DateTime.Now.AddYears(1), 
    o => o.AddMonths(1), 
    o => o.ToString("MMMM")); 
January 
February 
March 
April 
May 
June 
July 
August 
September 
October 
November 
December 
January 
Cuestiones relacionadas