protected void Page_Load(object sender, EventArgs e) { string bb = "<a href=\"http://www.baidu.com\">百度</a><Br />"; Response.Write(bb); IList<string> list = new List<string>() { "One", "Two", "Three", "Four", "Five", "Six", "Seven" }; #region /*1. * Where 和Select是两个定义在Ienumerable<TSource>接口中非常重要的方法.它们的定义如下: * public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) * public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate) * 所以任何来源于Ienumerable<TSource>接口的数据结构都能访问这个方法 * * var numbersLengthThree = list.Where(x => x.Length == 3).Select(x => x).ToList(); numbersLengthThree.ForEach(x => Response.Write(x + "<br />")); */ /*2. * All 这个方法确定是否所有元素序列都满足某种条件,如果每一个元素都可以满足设定的特殊条件或者它是空,则方法返回true,否则返回false * 定义如下: * public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) * * if (list.All(x => x.Length >= 3)) Response.Write("All numbers have at least three characters. "); */ /*3. * Any 这个方法确定序列中的元素是否存在或者满足某种特定的条件。方法定义如下: * public static bool Any<TSource>(this IEnumerable<TSource> source) * public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) * 第一种重载会找出元素序列是否包含元素, 第二种重载将会找出序列中是否有满足条件的元素 * * if (list.Any()) Response.Write("The sequence contains item."); * * if (list.Any(x => x.Length >= 3)) Response.Write("The sequence contains at least a item which has three or more characters."); */ #endregion IList<int> listNumber = new List<int>() { 1,2,3,4,5,6,7,8,9,10 }; #region /*4. * Average 方法会计算在序列中的数字的平均值,这个方法的定义如下: * public static double Average(this IEnumerable<int> source) * public static decimal Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector) * * // 55/10=5.5 Response.Write(string.Format("Average of the numbers :{0}", listNumber.Average())); // 2,4,6,8,10 =>30/5=6 =>6*2=12 Response.Write( string.Format("Average of the original numbers x2 :{0}", listNumber.Where<int>(x => x % 2 == 0).Select(x => x).Average(x => x * 2)) ); */ #endregion /*5. * Concat 这个方法的作用是连接(拼接)两个序列,它和Union不同,Union则返回序列中不重复(独一无二)的元素 * 而Concat返回序列中所有的原始元素,这个方法的定义如下: * public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) * * * Contains 是否包含有个或符合某条件的元素; * Count 获取或获取符合某条件的元素个数; * Distinct 去掉重复或符合某条件的重复元素;( Distict是用来排除相同序列中元素的,对于基础类型,可以直接使用Distinct) * ElementAt 在序列(集合)中,这个方法返回一个特定索引的一个元素; * Except 方法可以用在从一个集合中删除一个项集合.它放回一个由两个序列产生的集合差; * Intersect 它将产生两个序列的交集; * First 这个方法会返回序列中的第一个元素; * FirstOrDefault 它返回序列中第一个元素或者当没有元素未被找到时放回默认值.这个方法是First和Default的综合; * Last 返回序列中最后一个元素; * LastOrDefault 它返回序列中最后一个元素或者当没有元素未被找到时放回默认值.这个方法是Last和Default的综合; * * * LongCount 它会返回一个Int64去表示序列中元素的个数,方法定义是: * public static long LongCount<TSource>(this IEnumerable<TSource> source) * public static long LongCount<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) * */ IList<int> tempList = new List<int>() { 11,12,13,2,5,12,13 }; #region //Linq查询表达式中提供了join运算,比较常见的是join.. on ..equals,也就是内联接运算 //下面的demo相当于交集运算Intersect var do_join = from itemsA in tempList join itemsB in listNumber on itemsA equals itemsB into tempArr from arr in tempArr select arr; do_join.ToList().ForEach(x => Response.Write("join运算" + x + " ")); Response.Write("<br />"); listNumber.Concat(tempList).ToList().ForEach(x => Response.Write(x + " , ")); Response.Write("<br />"); listNumber.Union(tempList).ToList().ForEach(x => Response.Write(x + " , ")); Response.Write("<br />"); Response.Write(string.Format("大于7的元素个数为{0}", listNumber.Count<int>(s => s > 7))); Response.Write("<br />"); tempList.Distinct<int>().Select(x => x).ToList().ForEach(x => Response.Write(x + " , ")); //但是对于自定义类型,则需要额外的一些操作,方式有多种,这里选择其中一种,即实现IEquatable<> List<Employee> employee = new List<Employee>() { new Employee {Id= 1, Name = "Ringgo"}, new Employee {Id= 2, Name = "Rex"}, new Employee {Id = 1, Name = "jj"} }; employee.Distinct().ToList().ForEach(x => Response.Write(" " + x.Id + ":" + x.Name)); Response.Write("<br />"); Response.Write(tempList.Where(x => x % 2 == 1).Select(x => x).ToList().ElementAt(1).ToString()); //所有奇数元素集合中第二个元素 Response.Write("<br />"); IList<Person> personA = new List<Person>() { new Person{Name="jon",Address="hangzhou"}, new Person{Name="aa",Address="shanghai"}, new Person{Name="tt",Address="hangzhou"}, new Person{Name="gg",Address="hangzhou"} }; IList<Person> personB = new List<Person>() { new Person{Name="aa",Address="beijing"}, new Person{Name="dd",Address="shenzhen"} }; var resultPerson = (from p in personA select p.Name).Except(from q in personB select q.Name).ToList(); resultPerson.ForEach(x => Response.Write(x + " , ")); Response.Write("<br />"); tempList.Except(listNumber).ToList().ForEach(x => Response.Write(x + " , ")); //差集(减去另一个集合中包含的元素,如果没有包含就全部输出,有就去掉) Response.Write("<br />"); tempList.Intersect(listNumber).ToList().ForEach(x => Response.Write(x + " , ")); //交集(两个集合共有的元素) Response.Write("<br />"); #endregion /*6. *Contains 这个方法用来判断在一个序列(集合)中是否存在一个特殊的元素 *public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value) *public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer) * * Response.Write(string.Format("{0}\t{1}", tempList.Contains(2).ToString(), tempList.Contains(200).ToString())); */ /*7. * DefaultIfEmpty 这个方法会返回一个IEnumerable<T>类型的元素或者当序列(集合)为空事放回一个默认的单例集合.方法的定义如下: * public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source) * public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source, TSource defaultValue) * * */ #region List<Product> products = new List<Product>() { new Product(){ Id="1", Name="n1"}, new Product(){ Id="1", Name="n2"}, new Product(){ Id="2", Name="n1"}, new Product(){ Id="2", Name="n2"}, }; var ggresult = products.GroupBy(p => p.Id).Select(p => new { Id = p.Key, Name = p.FirstOrDefault().Name }); ggresult.ToList().ForEach(v => { Response.Write(v.Id + ":" + v.Name + " "); }); #endregion } public class Product { public string Id { get; set; } public string Name { get; set; } } public class Employee : IEquatable<Employee> { public int Id { get; set; } public string Name { get; set; } public bool Equals(Employee other) { try { if (Object.ReferenceEquals(other, null)) return false; if (Object.ReferenceEquals(this, other)) return true; return Id.Equals(other.Id); } catch { throw new NotImplementedException(); } } /// <summary> /// 这里重写了GetHashCode,Equals根据ID相同过滤对象 /// </summary> public override int GetHashCode() { return Id.GetHashCode(); } } public class Person { public string Name { get; set; } public string Address { get; set; } }
Find和FindAll的区别,Find找到第一个匹配项就结束了,而FindAll会去找所有符合的匹配对象
string[] arry = { "aa", "bb", "cc", "aabb" }; //var t = arry.ToList().Find(x => x.Contains("aa")); //只有aa var t = arry.ToList().FindAll(x => x.Contains("aa")); //aa和aabb t.ToList().ForEach(x => Response.Write(x + ", "));