2011-09-26 21 views
7

ile sekansı oluşturmak:I girdilerini şu var adım değeri

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

geçen değer olarak, birinci ve ZMAX olarak zmin çift dizi bir dizi oluşturmak istiyor. Fakat ikinci değerden sonuncuya kadar ama bir tanesi (zmax-zmin)/sayım ile doldurulmalıdır.

Örnek:

zmin = 1; 
zmax = 10; 
count = 3 

Beklenen sonuç:

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

Benim deneyin:

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

... –

cevap

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

*** örnek kullanım ***? – Kiquenet

0

Bu seferki numaralar için, ancak daha karmaşık türleri için sadece iyidir tarih/saat olarak. İkinci yöntem, sonuç seçici sağlamayı sağlar - bazı durumlarda faydalıdır.

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

Kullanımı:

Range(1, 10, o => o + 3); 
1 
4 
7 
10 
bir hata tanımlama değil
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