首頁 > 後端開發 > C#.Net教程 > .NET框架-集合和LINQ中的「分組」技術程式碼詳解

.NET框架-集合和LINQ中的「分組」技術程式碼詳解

黄舟
發布: 2017-03-18 13:13:28
原創
1588 人瀏覽過

我們常在一個記憶體集合,例如List,根據某個或某些個屬性#分組,統計顯示。最容易想到的方法便是,根據某個關鍵屬性,對List實例遍歷,轉換為如下字典型別

Dictionary<string, List<MyObject>
登入後複製

舉例,已知cars,

                List<Car> cars = new List<Car>(){                
                new Car(1,"audiA6","private"),                
                new Car(2,"futon","merchant"),                
                new Car(3,"feiren","bike"),                
                new Car(4,"bukon","private"),                
                new Car(5,"baoma","private"),                
                new Car(6,"dayun","merchant")
            };
登入後複製

想以id為鍵,值為Car轉換為一個字典idCarDict,除了遍歷這種邏輯最複雜,程式碼需要最多的方法,我們還可以直接利用ToDictionary方法,

ar idCarDict = cars.ToDictionary(car=>car.id);
登入後複製

但是,這個方法是有限制的,關鍵碼對應的物件實例只能有一個,也就是傳回的型別為,

Dictionary<string,Object>
登入後複製

這是糟糕的,因為可能一個關鍵碼對應多個實例,此時就得借助GroupBy,先按關鍵碼分組後,再轉換為字典。

例如,我們想以type為鍵,得到這個車型下的多輛車,

Dictionary<string, List<Car>> typeCarDict = 
cars.GroupBy(car => car.type).
ToDictionary(g => g.Key, g => g.ToList());
登入後複製

這種轉換程式碼簡潔,比以下遍歷邏輯好很多!

var dict = new Dictionary<string,List<Car>>();foreach(var car in cars)
{  if(dict.Contains(car.type))
     dict[car.type].Add(car);
  else
    dict.Add(car.type,new List<Car>(){car}));}
登入後複製

這樣解決了一個關鍵碼對應多個實例的轉化,那麼根據多個關鍵碼的組合對應多個實例的問題,借助List上的GroupBy能實現嗎? 不能實現。

這時候,需要寫Linq語句,將多個關鍵碼組合為一個新的對象,

new {key1, key2, ...}
登入後複製

舉一個列子,我們有這麼一個集合,集合中的元素是ValPair對象,這個物件包含兩個整形元素,Val1是小者,Val2相對大。如何依照Val1,Val2的組合分組呢?
請看下面邏輯:

        static void printfDuplicateCompare(List<ValPair> compares)
        {            //按组合键分组后,每组元素个数大于2的分组,按降序排序
            var rtnByVal1 = from item in compares                            
            group item by new { item.Val1, item.Val2 }                                
            into g                                
            where g.Count()>1
                                orderby g.Count() descending
                                select g;            //按Val1和Val2组合为字典键,元素个数为值
            var dict = rtnByVal1.ToDictionary(g => g.Key,g=>g.Count());
        }
登入後複製

總結

List的GroupBy只能根據一個鍵分組,如果需要根據多個鍵組合分組,就得寫Linq語句組合。

以上是.NET框架-集合和LINQ中的「分組」技術程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板