1. 程式人生 > >Linq下有一個非常實用的SelectMany方法,很多人卻不會用

Linq下有一個非常實用的SelectMany方法,很多人卻不會用

在平時開發中經常會看到有些朋友或者同事在寫程式碼時會充斥著各種for,foreach,這種程式程式碼太多的話閱讀性特別差,而且還顯得特別累贅,其實在FCL中有很多幫助我們提高閱讀感的方法,而現實中很多人不會用或者說不知道,這篇我就跟大家聊一聊。

一:SelectMany

這個方法絕對是提高開發速度的一大利器,有太多的業務場景需要使用這個函式,舉一個我實際應用場景,商家按照年份和客戶型別預先設定一些標籤,然後讓系統跑一下它的各自標籤到底有多少人?

1. 定義Model

為了方便演示,這裡做了一下簡化程式碼,只有一個字典,key表示年份,value:就是該年份的多組標籤。


    public class EstimateModel
    {
        public int ShopID { get; set; }

        //key: 年份
        public Dictionary<string, List<TagCrowdFilterModel>> YearCrowdFilterDict { get; set; }
    }

    public class TagCrowdFilterModel
    {
        /// <summary>
        /// 篩選條件
        /// </summary>
        public string CrowdFiter { get; set; }

        /// <summary>
        /// 獲取人數
        /// </summary>
        public int TotalCustomerCount { get; set; }
    }

為了更加清晰,我決定再填充一下資料

        public static void Main(string[] args)
        {
            var estimateModel = new EstimateModel()
            {
                ShopID = 1,
                YearCrowdFilterDict = new Dictionary<string, List<TagCrowdFilterModel>>()
                {
                    {
                        "17年",new List<TagCrowdFilterModel>()
                               {
                                 new TagCrowdFilterModel(){ CrowdFiter="between 10 and 20" },
                                 new TagCrowdFilterModel(){ CrowdFiter=" a<10  || a>30" },
                               }
                    },
                    {
                        "18年",new List<TagCrowdFilterModel>()
                               {
                                 new TagCrowdFilterModel(){ CrowdFiter="between 100 and 200" },
                                 new TagCrowdFilterModel(){ CrowdFiter=" a<100  || a>300" },
                               }
                    },
                    {
                        "19年",new List<TagCrowdFilterModel>()
                               {
                                 new TagCrowdFilterModel(){ CrowdFiter="between 1000 and 2000" },
                                 new TagCrowdFilterModel(){ CrowdFiter=" a<1000  || a>3000" },
                               }
                    }
                }
            };
        }

        public static int GetCustomerID(string crowdfilter)
        {
            return BitConverter.ToInt32(Guid.NewGuid().ToByteArray(), 0);
        }

2. 實現需求

需求也很簡單,就是依次獲取 TagCrowdFilterModel 中的 CrowdFiter 欄位再呼叫GetCustomerID方法把人數賦值給TotalCustomerCount即可,這麼簡單的需求,如果讓你來搞定,你該怎麼實現這個邏輯? 沒錯,很多人可能就是兩個foreach搞定。

        foreach (var year in estimateModel.YearCrowdFilterDict.Keys)
        {
            var yearCrowdFitlerList = estimateModel.YearCrowdFilterDict[year];

            foreach (var crowdFitler in yearCrowdFitlerList)
            {
                crowdFitler.TotalCustomerCount = GetCustomerID(crowdFitler.CrowdFiter);
            }
        }

看似程式碼也很清爽,但現實哪有這麼好的事情,真實情況是年份上可能還要套上一個客戶型別,客戶型別之上再套一個商品,商品之上再套一個商家,這樣很深的層級你就需要多達3個foreach,4個foreach甚至5個foreach才能搞定,再放張圖給大家看看,是不是看著頭大...