加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#范例:对列表的副作用

发布时间:2020-12-15 06:33:26 所属栏目:百科 来源:网络整理
导读:我正在努力发展我对副作用的理解,以及如何控制和应用. 在以下航班列表中,我想设置每个航班的财产满足条件: IEnumerableFlightResults fResults = getResultsFromProvider();//Set all non-stop flights descriptionfResults.Where(flight = flight.NonStop)
我正在努力发展我对副作用的理解,以及如何控制和应用.

在以下航班列表中,我想设置每个航班的财产满足条件:

IEnumerable<FlightResults> fResults = getResultsFromProvider();

//Set all non-stop flights description
fResults.Where(flight => flight.NonStop)
        .Select(flight => flight.Description = "Fly Direct!");

在这个表达式中,我的列表中有一个副作用.从我有限的知识,我知道为ex. “LINQ仅用于查询”和“只有少数操作列出,分配或设置值不是其中之一”,“列表应该是不可变的”.

>我上面的LINQ语句有什么问题,应该怎么改?
>我在哪里可以获得有关上述情景的基本范式的更多信息?

解决方法

您的LINQ代码不会“直接”违反您提及的准则,因为您不修改列表本身;你只是修改列表内容的一些属性.

然而,驱动这些准则的主要反对意见仍然是:您不应该使用LINQ修改数据(同样,您正在滥用选择来执行副作用).

不修改任何数据可以很容易地证明.考虑这个代码段:

fResults.Where(flight => flight.NonStop)

你看到这是修改航班属性的地方吗?既不会有很多维护程序员,因为他们会停止阅读之后的地方 – 以下代码显然没有副作用,因为这是一个查询,对吗?

[Nitpick:当然,看到一个没有保留返回值的查询是一个死信号,查询确实有副作用,或者代码应该被删除;无论如何,“有什么问题”.但是,当只有两行代码可以查看而不是页面的页面时,这更简单.]

作为一个正确的解决方案,我建议这样做:

foreach (var x in fResults.Where(flight => flight.NonStop))
{
    x.Description = "Fly Direct!";
}

很容易写和读.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读