我正在做一个 C# 练习来创建一个操作,该操作接受一个集合,对集合中的每个对象执行一个函数,并返回一个修改过的对象的集合。我的代码目前如下:public static IEnumerable<U> Accumulate<T, U>(this IEnumerable<T> collection, Func<T, U> func){ IEnumerable<U> output = Enumerable.Empty<U>(); foreach (T item in collection) { output.Append(func(item)); } return output;}这只是返回一个空集合,我不知道为什么。在另一个线程中看到这种方法后,我尝试在 foreach 中创建该项目的副本,如下所示:foreach (T item in collection) { U copy = func(item); output.Append(copy); }但这并没有解决任何问题。我做了一些研究,但真的找不到任何例子来做我在这里想做的事情。我读了一些关于闭包的东西,但不能真正理解它,因为我是 C# 的新手。
2 回答
慕容708150
TA贡献1831条经验 获得超4个赞
回答您的实际问题:它不起作用的原因是因为
output.Append(func(item));
不会改变output- 相反,它会返回一个func(item)附加到output. 因此,当您最终返回时,output您只是返回原始的空序列。
你可以通过这个简单的改变让你的工作:
output = output.Append(func(item));
但是,这不是一种有效的方法 - 您最好使用 yield,通过如下修改您的方法:
public static IEnumerable<U> Accumulate<T, U>(this IEnumerable<T> collection, Func<T, U> func)
{
foreach (T item in collection)
{
yield return func(item);
}
}
尽管请注意,这更简单地表示为:
public static IEnumerable<U> Accumulate<T, U>(this IEnumerable<T> collection, Func<T, U> func)
{
return collection.Select(item => func(item));
}
但是了解如何执行此操作很有用,yield这样您就可以为更复杂的类似 Linq 的问题编写解决方案。
- 2 回答
- 0 关注
- 151 浏览
添加回答
举报
0/150
提交
取消