生成具有步长值的序列

问题描述 投票:7回答:2

我有以下输入:

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

我想生成一个双数组序列,其中zmin为第一个值,zmax为最后一个值。但是从第二个值到最后一个,但它应该被(zmax-zmin)/ count所左右。

例:

zmin = 1;
zmax = 10;
count = 3

预期结果:

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

我的尝试:

double[] result = Enumerable.Repeat(zmin, N).Select(iv => (iv +(zmax-zmin)/count)).ToArray();
c# .net linq
2个回答
10
投票
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; 
}

1
投票

这个不仅适用于数字,也适用于日期/时间更复杂的类型。

第二种方法允许提供结果选择器 - 在某些情况下很有用。

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

用法:

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
© www.soinside.com 2019 - 2024. All rights reserved.