發現IEnumerable<TSource>定義了很多擴展方法,這個是List的基類,所以也可以適用於List,整理如下。
1 首先要使用Linq
using System.Linq
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 返回集合,存在於首參,不存在於二能。
First, FirstOrDefault 返回第一個值,可指定條件。
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作爲集合。