關於List的擴展方法

發現IEnumerable<TSource>定義了很多擴展方法,這個是List的基類,所以也可以適用於List,整理如下。


1 首先要使用Linq

using System.Linq


2 各函數分析如下:

  Aggregate 累加器
  All         是否都爲真。
  Any         無參:有元素返真,有參,有滿足的元素返真。
  AsEnumerable 看起來類似一個Clone。
  Average    取平均值。針對float,double,decimal,int,long,返回則爲前三種類型。
               有參版:增加過濾條件。
  Cast         無參,類型轉換,無模板轉有模板,不能轉報錯。
  Concat     合併兩個集合。
  Contains   是否包含。雙參表增加相同比較接口。
  Count      數量,有參:條件過濾。
  DefaultIfEmpty  如果參數爲空,返回默認值。默認值可以指定。。。也就是說如果Count=0,會變成Count=1

            List<string> ll = new List<string>();
            IEnumerable<string> ss = ll.DefaultIfEmpty("cde");
            string s = ss.First<string>();
            //返回"cde"。


  Distinct  返回非重複項。
  ElementAt 返回指定索引值。
 ElementAtOrDefault 返回指定索引值或default(TSource)
 Empty      返回空的集合。。類似於AsEnumerable,只是沒有數據
 Except     返回集合,存在於首參,不存在於二能。
 FirstFirstOrDefault  返回第一個值,可指定條件。
 GroupBy     根據參數的不同有多個版本

                版本1:返回類似於Dictiony<string,list<string>>

            //根據首字母進行分組
            List<string> lst = new List<string>() { "abc", "def", "2","22" };
            var igrp = lst.GroupBy<string, string>(k => k[0].ToString());
            StringBuilder bui = new StringBuilder();
            foreach (var v in igrp)
            {
                bui.Append(v.Key + ":");
                foreach (var vv in v)
                {
                    bui.Append(" " + vv.ToString());
                }
                bui.AppendLine();
            }
            輸出爲:

a: abc
d: def
2: 2 22

            版本2:GroupBy<TSource, TKey, TResult>:處理分組後的數據。返回List結構

            List<string> lst = new List<string>() { "abc", "def", "2","22" };
             var grp = lst.GroupBy<string, string, string>(k => k[0].ToString(), (k1, arr) =>
            {
                return k1 + ":" + arr.Aggregate((a, b) => a + " " + b);
            });
            foreach (var c in grp)
            {
                System.Diagnostics.Debug.WriteLine(c);
            }

a:abc
d:def
2:2 22


            版本3:GroupBy<TSource, TKey, TElement>:處理分組後的數據,返回Dictionary結構,其中TSource要轉爲TElement
            var grp2 = lst.GroupBy<string, string, int>(k => k[0].ToString(), a => a.Length);
            輸出爲:
a: 3
d: 3
2: 1 2


             版本4:GroupBy<TSource, TKey, TElement, TResult>:處理分組後的數據,返回TResult類型的集合。
            var grp2 = lst.GroupBy<string, string, int, string>(k => k[0].ToString(), a => a.Length, (a, arr) => a + " count:" + arr.Count().ToString() );
            foreach (var c in grp2)
            {
                System.Diagnostics.Debug.WriteLine(c);
            }
            輸出爲:
a count:1
d count:1
2 count:2

             版本5-8:上面四個版本增加IEqualityComparer<TKey> comparer);

GroupJoin    比較兩個集合,按指定函數輸出結果:
            List<string> lst = new List<string>() { "abc", "def", "2","22" };
            List<string> lst2 = new List<string>() { "abc" };
            var grp2 = lst.GroupJoin<string, string, string, string>(lst2, k => k[0].ToString(), k => k[0].ToString(), (a, arr) => a + " count:" + a.Count().ToString());
            foreach (var c in grp2)
            {
                System.Diagnostics.Debug.WriteLine(c);
            }


            輸出爲:(也就是說最後一個表達式中傳的是this裏的值。而不是關鍵字)
abc count:3
def count:3
2 count:1
22 count:2




Last,LastOrDefault        返回最後一項。可指定條件。
LongCount   64位的長度,Count的升級版,,,好大。。
Max          針對float,double,decimal,int,long,
             以及通用版:TSource Max<TSource>(this IEnumerable<TSource> source);
             可指定比較函數。
Min          參Max
OfType     返回集合,數據爲指定類型,這個可能是針對多種對象的集合。
OrderBy    排序,指定關鍵字算法。可指定比較算法。
OrderByDescending 參OrderBy
Range      生成整數集合,這個很象Python。
           foreach(int i in Enumerable.Range(1,3)){Debug.WriteLine(i);}
Repeat       生成多個相同的數據的集合。
           foreach (string i in Enumerable.Repeat<string>("abc", 8)) { Debug.WriteLine(i); }
Reverse    反轉。
Select     Select<TSource, TResult>,可以認爲是數據轉化。例子:
             lst2.Select<string, int>(a => a.Length);

3,在上面的函數定義中使用了一些模板類,分析如下:

3.1 Func<TSource, TSource, TSource> func 對應的定義:

  public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
  即定義函數:前兩個參數爲調用值,第三參數爲返回值。
  public delegate TResult Func<in T, out TResult>(T arg);
  即定義函數:前一個參數爲調用值,第二參數爲返回值。


3.2 IEqualityComparer<TSource> comparer 對應的是一個接口。
  接口有兩個函數,但是C#匿名類不能定義函數。
3.3 IComparer<TKey> comparer 對應的也是接口。不太好用。


3.4 IGrouping<TKey, TSource> 對應是的一個模板類,Key作爲屬性,TSource作爲集合。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章