一遍学习基础,一遍练习打字,很多乐趣。

代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection; namespace dazilianxi
{
public class Category
{
public int Id { get;set;}
public string Name { get; set; }
}
public class Product {
public int Id { get; set; }
public string Name { get; set; }
public Category Category { get; set; }
public DateTime BuyDate { get; set; }
public decimal Price { get; set; } public override string ToString()
{
return string.Format("编号:{0},名称:{1},类别:{2},购买时间:{3},价格{4}",Id,Name,Category.Name,BuyDate,Price); }
}
public static class ProductHelper
{
public static IEnumerable<Product> GetProducts()
{
Category cat1 = new Category();
cat1.Id = ;
cat1.Name = "数码电子";
Category cta2 = new Category();
cta2.Id = ;
cta2.Name = "服饰类"; List<Product> list = new List<Product>()
{
new Product(){ Id=,Name="数码相机",Price=1899M,BuyDate=new DateTime(,,),Category=cat1
},
new Product(){Id=,Name="录像机",Price=1000M,BuyDate=new DateTime(,,),Category=cat1},
new Product(){Id=,Name="体恤衫",Price=150M,BuyDate=new DateTime(,,),Category=cta2},
new Product(){Id=,Name="夹克衫",Price=180M,BuyDate=new DateTime(,,),Category=cta2}
};
return list;
}
} public class ProductComparer : IComparer<Product>, IEqualityComparer<Product>//居然要具体的类
{
public int Compare(Product x, Product y)
{
if (x == y)//如果类别名称相同就比较产品价格
{
return x.Price.CompareTo(y.Price);
}
else //如果类别名称不同,比较类别的编号
{
return x.Category.Id.CompareTo(y.Category.Id);
}
} public bool Equals(Product x, Product y)
{
if (x.Category.Name == y.Category.Name)
{
return true;
}
else
{
return false;
}
} //这个是接口里的,一定要实现
public int GetHashCode(Product obj)
{
return obj.GetHashCode();
}
} public class PropertyComparer<T> : IEqualityComparer<T>
{
//需要比较的属性的PropertyInfo
private PropertyInfo _PropertyInfo; //通过构造函数把需要比较的属性传进来
public PropertyComparer(string propertyName)
{
_PropertyInfo = typeof(T).GetProperty(propertyName,BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);//原来这个地方也可以有几个选项| 神了
if (_PropertyInfo == null)
{
throw new ArgumentException(string.Format("{0} 不是{1}的属性", propertyName, typeof(T)));
}
} public bool Equals(T x, T y)
{
object xValue = _PropertyInfo.GetValue(x, null);
object yValue = _PropertyInfo.GetValue(y, null); //如果xValue的属性值为null,那yValue的属性值也必须是null,才返回true
if (xValue == null)
return yValue == null;
return xValue.Equals(yValue);
} public int GetHashCode(T obj)
{
object propertyValue = _PropertyInfo.GetValue(obj, null);
if (propertyValue == null)
return ;
else
{
return propertyValue.GetHashCode();
}
}
}
}
            var query = ProductHelper.GetProducts().OrderBy(x=>x.Id).OrderBy(b=>b.BuyDate).OrderByDescending(c=>c.Category.Id).ThenBy(p=>p.Price);
showConsole(query);
var query2 = ProductHelper.GetProducts().Select((x, index) => new { name=x.Name,index=index});//这里用到了一个匿名对象
foreach(var item in query2){
Console.WriteLine("名称:{0},索引{1}",item.name,item.index);
}
var query3 = ProductHelper.GetProducts().OrderBy(x => x, new ProductComparer());
showConsole(query3);
List<int> list = new List<int>()
{
, ,,,,,,,,,,
};
var query4 = list.Skip().Take();
showConsole<int>(query4);
Console.WriteLine("-------");
var query5 = list.TakeWhile(x => x <= ).TakeWhile(x => x > );//
showConsole(query5);
Console.WriteLine("-------");
var query6 = list.TakeWhile(x => x <= ).Where(x => x > );//3,2,3,4,5
showConsole(query6);
Console.WriteLine("-------");
var query7 = list.TakeWhile(x => x <= ).Where(x => x > ).Distinct();//3,2,4,5 去重
showConsole(query7);
Console.WriteLine("-------");
int[] arr1 = { , , , };
int[] arr2 = { , , };
var query8 = arr1.Intersect(arr2);//取交集2,3
showConsole<int>(query8);
Console.WriteLine("-------");
var query9 = arr1.Except(arr2);//Except()获取第一个集合中有,而第二个集合中没有的元素 0,1
showConsole<int>(query9);
Console.WriteLine("-------");
var query10 = arr1.Concat(arr2); //Concat()将2个集合串联起来,不剔除重复元素
showConsole<int>(query10);
Console.WriteLine("-------");
var query11 = arr1.Union(arr2); //Union()将2个集合串联起来,剔除重复元素
showConsole<int>(query11);
Console.WriteLine("-------");
//Zip()合并2个集合中位置相同的元素,将2个元素的操作结果返回一个新的元素。如果两个集合的长度不相等,以长度短的为准。
int[] arr11 = { , };
string[] arr22 = { "星期一", "星期二", "星期三" };
var query12 = arr11.Zip(arr22, (x, y) => String.Format("{0},{1}", x, y));
showConsole<string>(query12); private static void showConsole<T>(IEnumerable<T> list)
{
foreach (T item in list)
{
Console.WriteLine(item.ToString());
}
}

总结:

● 一般性的条件筛选:Where() 
● 返回具体的集合类型再进行链式操作:OfType() 
● 非泛型集合转换成泛型集合后再使用LINQ操作符:Cast() 
● 排序、链式排序:OrderBy(), ThenBy(),实现IComparer<T>接口可以自定义排序规则 
● 投影:Select() 
● 返回前N个,跳过N个,分页:Take()和Skip()   
● 返回符合/不符合条件,但不执行完遍历:TakeWhile()和SkipWhile() 
● 反转集合元素:Reverse() 
● 空集合处理:DefaultIfEmpty() 
● 剔除集合中的重复元素:Distinct(),实现IEqualityComparer<Category>可自定义相等规则,针对某具体类或写一个泛型方法 
● 分组以及分组后投影:GroupBy()

● 2个集合的交集:Intersect() 
● 2个集合的查集:Except() 
● 2个集合的串联:Concat()和Union() 
● 2个集合的合并:Zip()

来源于:http://www.cnblogs.com/darrenji/p/3638561.html

http://www.cnblogs.com/darrenji/p/3638788.html

http://www.cnblogs.com/darrenji/p/3647823.html

非常基础的知识点,只有实践一次,才真的明白。

(C#基础)Linq学习理解的更多相关文章

  1. .Net程序员之Python基础教程学习----列表和元组 [First Day]

    一. 通用序列操作: 其实对于列表,元组 都属于序列化数据,可以通过下表来访问的.下面就来看看序列的基本操作吧. 1.1 索引: 序列中的所有元素的下标是从0开始递增的. 如果索引的长度的是N,那么所 ...

  2. (转)Linq学习笔记

    写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...

  3. C#之Linq学习笔记【转】

    写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...

  4. 零基础如何学习java更有效呢?

    零基础学java,不知道该如何入手?也不知道学习的方向,很多人会问零基础怎么样学习,有没有什么入门的书籍推荐:只要方法正确,零基础学好java也是有机会的哦. 一.理解Java思想 Java是一门面向 ...

  5. LINQ to XML LINQ学习第一篇

    LINQ to XML LINQ学习第一篇 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: public static void CreateDoc ...

  6. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

  7. face recognition[翻译][深度学习理解人脸]

    本文译自<Deep learning for understanding faces: Machines may be just as good, or better, than humans& ...

  8. 20145308 《网络对抗》Web安全基础实践 学习总结

    20145308 <网络对抗> Web安全基础实践 学习总结 实验内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 基础问题回答 (1)SQL注入攻击原理, ...

  9. 20145308 《网络对抗》 逆向及BOF基础实践 学习总结

    20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...

随机推荐

  1. Android 自动化测试介绍

    1 介绍: 风格: 3, 4,

  2. Python3基础 os.path.splitext 处理文件名,得到文件名+扩展名

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. Django组件(一) Django之分页器

    Django的分页器(paginator)简介 在页面显示分页数据,需要用到Django分页器组件 from django.core.paginator import Paginator Pagina ...

  4. Linux系统编程--文件描述符的复制dup()和dup2()【转】

    本文转载自:http://blog.csdn.net/tennysonsky/article/details/45870459 dup() 和 dup2() 是两个非常有用的系统调用,都是用来复制一个 ...

  5. 乘积最大|2018年蓝桥杯B组题解析第十题-fishers

    标题:乘积最大 给定N个整数A1, A2, ... AN.请你从中选出K个数,使其乘积最大. 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数. 注意,如果X ...

  6. ZooKeeper与Kafka相关

    Kafka集群搭建: https://www.cnblogs.com/likehua/p/3999538.html https://www.cnblogs.com/mikeguan/p/7079013 ...

  7. HDU 1863 畅通工程 (最小生成树

    看卿学姐视频学到的题目 kruskal算法实现最小生成树 #include<bits/stdc++.h> using namespace std; ; typedef long long ...

  8. Java ArrayDeque源码剖析

    ArrayDeque 本文github地址 前言 Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字).当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的A ...

  9. ZOJ 3469 Food Delivery(区间DP)

    https://vjudge.net/problem/ZOJ-3469 题意:在一条直线上有一个餐厅和n个订餐的人,每个人都有随时间上升的不满意值,从餐厅出发,计算出送完时最小的不满意值总和. 思路: ...

  10. MongoDB(课时22 唯一索引)

    3.6.1 唯一索引 唯一索引的主要目的是用在某一个字段上,使该字段的内容不重复. 范例:创建唯一索引 db.students.ensureIndex({"name" : 1}, ...