为了账号安全,请及时绑定邮箱和手机立即绑定

尝试在 foreach 循环中将对象附加到 Enumerable

尝试在 foreach 循环中将对象附加到 Enumerable

C#
慕沐林林 2021-11-14 15:39:10
我正在做一个 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 的问题编写解决方案。


查看完整回答
反对 回复 2021-11-14
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

通常,当我想要实现这种行为时,我会使用 C# 迭代器。当您想要处理某种数据的迭代并且在每次迭代时返回一个附加到结果集合的值时,它们非常有用。



查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信