我有以下范围类和扩展:
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>
,您必须定义如何获得下一个项目。
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);