gpt4 book ai didi

c# - 在扩展上使用累加器

转载 作者:行者123 更新时间:2023-11-30 18:19:57 26 4
gpt4 key购买 nike

我有以下范围类和扩展:

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>您必须定义如何获取下一项。

我认为最合适的名称是 ma​​p 而不是 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);

关于c# - 在扩展上使用累加器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38038204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com