2011-09-26 13 views
7

Mam następujące wejścia:Generowanie sekwencji o wartości kroku

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

Chcę, aby wygenerować sekwencję podwójnego tablicy z Zmin jako pierwszy i zmax jako ostatniej wartości. Ale od drugiej wartości do ostatniej, ale powinna być prowadzona przez (zmax-zmin)/count.

Przykład:

zmin = 1; 
zmax = 10; 
count = 3 

Oczekiwany wynik:

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

My try:

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

To nie jest opis błędu ... –

Odpowiedz

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

*** Wykorzystanie próbki ***? – Kiquenet

0

Ten jest dobry nie tylko dla liczb, ale w przypadku bardziej złożonych typów jako datę/czas.

Druga metoda pozwala zapewnić selektor wyników - w niektórych przypadkach przydatny.

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; 
    } 
} 

Zastosowanie:

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 
Powiązane problemy