2011-09-26 25 views
7

Tôi đã đóng góp như sau:Tạo chuỗi giá trị với bước

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

Tôi muốn tạo ra một chuỗi các mảng đôi với zmin như đầu tiên và Zmax như giá trị cuối cùng. Nhưng từ giá trị thứ hai cho đến khi cuối cùng nhưng một trong những nó nên được steзped bởi (zmax-zmin)/count.

Ví dụ:

zmin = 1; 
zmax = 10; 
count = 3 

Kết quả mong đợi:

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

thử của tôi:

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

Đó không phải là một mô tả lỗi ... –

Trả lời

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

*** sử dụng mẫu ***? – Kiquenet

0

Cái này là tốt không chỉ cho con số, nhưng đối với các loại phức tạp hơn như ngày/giờ.

Phương pháp thứ hai cho phép cung cấp bộ chọn kết quả - hữu ích trong một số trường hợp.

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

Cách sử dụng:

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 
Các vấn đề liên quan