在扩展上使用累加器



我有以下范围类和扩展:

public class Range<T> where T : IComparable<T> {
  public T Minimum { get; set; }
  public T Maximum { get; set; }
  public Range(T minimum, T maximum) {
    Minimum = minimum;
    Maximum = maximum; 
  } // Range
}
public static IEnumerable<T> Expand<T>(this Range<T> range, Func<T, T> accumulator) where T : IComparable<T> {
  T current = range.Minimum;
  while (current.CompareTo(range.Maximum) <= 0) {
    yield return current;
    current = accumulator(current);
  }
}

我正在尝试创建扩展范围的自定义方式。例如:

Range<Int32> range = new Range<Int32>(20, 24);
List<Int32> expect = new List<Int32> { 40, 21, 44, 23, 48 };
List<Int32> result = range.Expand(x => x % 2 == 0 ? x + 1 : x).ToList();
Assert.Equal(expect, result);

当我运行这段代码时,我得到了一个异常:

Array dimensions exceeded supported range 
例如,如果我使用: ,也会发生同样的情况。
List<Int32> result = range.Expand(x => 2 * x).ToList();

创建这个扩展的正确方法是什么?

我的作品如果使用:

List<Int32> result = range.Expand(x => ++x).ToList();

但是当使用

时,我得到了相同的异常
List<Int32> result = range.Expand(x => x++).ToList();

为什么?

你的代码的问题是,你没有得到下一个项目在你的范围。当你在蓄电池中有++x时,它就会为你完成这项工作。你应该移动到下一个项目在你的while循环。由于您使用的是通用的Range<T>,您必须定义如何获得下一个项目。

map,而不是accumulator
public class Range<T>
{
    public T Minimum { get; set; }
    public T Maximum { get; set; }
    public Func<T, T> Next { get; set; }
    public Range(T min, T max) { Minimum = min; Maximum = max; }
}
public static IEnumerable<T> Expand<T>(this Range<T> range, Func<T, T> map) where T : IComparable<T>
{
    T current = range.Minimum;
    while (current.CompareTo(range.Maximum) <= 0)
    {
        var result = map(current);
        yield return result;
        current = range.Next(current);
    }
}

Range<Int32> range = new Range<Int32>(20, 24);
range.Next = x => x + 1;
List<Int32> expect = new List<Int32> { 40, 21, 44, 23, 48 };
List<Int32> result = range.Expand(x => x % 2 == 0 ? x * 2 : x).ToList();
Assert.Equal(expect, result);

相关内容

  • 没有找到相关文章

最新更新