IEnumerable踩过的坑

1.

查询接口:建议使用IEnumerable

更新、创建接口:不要使用IEnumerable(maybe 接口会重复调用);建议使用可以讲结果保存到内存中的类型(like:IList、IDictionary)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
                var result = _serviceItemConsumeRecordSvc.Add(consumeResult).ToList();
//if _serviceItemConsumeRecordSvc.Add return as IEnumerable<object>
//warn,first call Add():result.Any()
                if (result == null || !result.Any())
                {
                    var msg = $"no serviceItemConsumeRecord can be added";
                    _loger.Warn(msg,  consumeResult );
                    yield return new SPOSpendingActionResponseItem()
                    {
                        Sucess = false,
                        Message = msg
                    };
                    continue;
                }
                #endregion
 
                #region return
//warn,second call Add(): foreach (var itemResult in result)
                foreach (var itemResult in result)
                {
                   //……
                }
                #endregion           

  

2.

foreach 循环中 yield return 之后,记得添加:continue

非 foreach 循环中 :返回 yield break;(yield return null之后,后续代码仍旧会执行)

1
2
3
4
5
6
7
8
9
10
11
12
13
        public IEnumerable<SPOUsedSearchExtendResponseItem> UsedRecordFullSearch(SPOUsedSearchExtendRequest req)
        {
            var usedRecords = UsedRecordsSearch(req);
            if (usedRecords == null || usedRecords.Data == null || !usedRecords.Data.Any())
            {
//warn :use "yield break" instead of "yield return null"(;
//otherwise [ var consumerRecordLK = usedRecords.Data.ToLookup(_ => _.ProduceRecordNumber);] will execute
                yield break;
            }
            var consumerRecordLK = usedRecords.Data.ToLookup(_ => _.ProduceRecordNumber);
            //……
        }
    

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                #region return
                foreach (var itemResult in result)
                {
                    if (!itemResult.IfSuccess || itemResult.SICRs == null || !itemResult.SICRs.Any())
                    {
 
                        yield return new SPOSpendingActionResponseItem()
                        {
                            Sucess = itemResult.IfSuccess,
                            SICR = itemResult.SICRs!=null? itemResult.SICRs.ToList():null,
                            Message = itemResult.Message
                        };
// warn:
// if: in foreach, yield return & not end continue
// then:【 var produceRecordNumbers = itemResult.SICRs.Select(_ => _.ProduceRecordNumber); 】will execute,instead of skip to foreach
                        continue;
                    }
                    var produceRecordNumbers = itemResult.SICRs.Select(_ => _.ProduceRecordNumber);
                   //……
                }
                #endregion

  

 

posted @   PanPan003  阅读(121)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?
历史上的今天:
2018-04-18 微服务架构与实践7_监控与告警
2018-04-18 微服务架构与实践6_日志聚合
点击右上角即可分享
微信分享提示