gpt4 book ai didi

c# - 对 FirstOrDefault 的不同看法

转载 作者:可可西里 更新时间:2023-11-01 08:50:33 26 4
gpt4 key购买 nike

IEnumerable 扩展方法 FirstOrDefault 并不完全符合我的要求,因此我创建了 FirstOrValue。这是解决此问题的好方法还是有更好的方法?

public static T FirstOrValue<T>(this IEnumerable<T> source, Func<T, bool> predicate, T value)
{
T first = source.FirstOrDefault(predicate);
return Equals(first, default(T)) ? value : first;
}

最佳答案

您的代码可能不正确;您可能没有考虑所有情况。

当然,在我们有规范之前,我们无法知道任何代码是正确的还是不正确的。因此,从编写单行规范开始:

"FirstOrValue<T> 采用 T 的序列、谓词和 T 的值,如果有则返回序列中与谓词匹配的第一项,否则返回指定的值”

您的尝试是否真正实现了该规范?当然不是!测试一下:

int x = FirstOrValue<int>( new[] { -2, 0, 1 }, y=>y*y==y, -1);

这会返回 -1。根据规范的正确答案是 0。匹配谓词的第一项是零,因此应该返回它。

规范的正确实现应该是这样的:

public static T FirstOrValue<T>(this IEnumerable<T> sequence, Func<T, bool> predicate, T value)
{
if (sequence == null) throw new ArgumentNullException("sequence");
if (predicate == null) throw new ArgumentNullException("predicate");
foreach(T item in sequence)
if (predicate(item)) return item;
return value;
}

总是先写一个规范,即使它只是一个句子。

关于c# - 对 FirstOrDefault 的不同看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708846/

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