gpt4 book ai didi

c# - 如何使用自定义枚举器避免无限递归?

转载 作者:太空狗 更新时间:2023-10-29 21:41:07 26 4
gpt4 key购买 nike

我做了一个扩展方法来查找集合中连续值的数量。因为它是通用的,所以我允许调用者定义“增量器”,它是一个 Func<>,应该增加值以检查是否存在“下一个”值。

但是,如果调用者传递了一个不正确的增量(即 x => x),则会导致无限递归循环。关于防止这种情况的干净方法有什么建议吗?

public static int CountConsecutive<T>(this IEnumerable<T> values, T startValue, Func<T, T> incrementor)
{
if (values == null)
{
throw new ArgumentNullException("values");
}
if (incrementor == null)
{
throw new ArgumentNullException("incrementor");
}
var nextValue = incrementor(startValue);
return values.Contains(nextValue)
? values.CountConsecutive(nextValue, incrementor) + 1
: 1;
}

最佳答案

要处理最简单的情况,您可以这样做:

var nextValue = incrementor(startValue);
if (nextValue.Equals(startValue)) {
throw new ArgumentException("incrementor");
}

对于一般情况,这样做:

public static int CountConsecutive<T>(this IEnumerable<T> values, T startValue, Func<T, T> incrementor) {
if (values == null) {
throw new ArgumentNullException("values");
}
if (incrementor == null) {
throw new ArgumentNullException("incrementor");
}
ISet<T> seen = new HashSet<T>();
return CountConsecutive(values, startValue, incrementor, seen);
}

private static int CountConsecutive<T>(IEnumerable<T> values, T startValue, Func<T, T> incrementor, ISet<T> seen) {
if (!seen.Add(startValue)) {
throw new ArgumentException("incrementor");
}
var nextValue = incrementor(startValue);
return values.Contains(nextValue)
? values.CountConsecutive(nextValue, incrementor) + 1
: 1;
}

关于c# - 如何使用自定义枚举器避免无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8347800/

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