代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharp { class Linq { public static void Show(List<Product> fruits) { foreach (var itme in fruits) { Console.WriteLine("编号:{0},商品名称:{1},商品价格:{2},商品品牌:{3},商品型号:{4}", itme.Id, itme.Name, itme.Price, itme.Brand, itme.Sell); } } static void Main(string[] args) { //匿名对象:在方法里面可以直接使用不需要传递,减少代码提高效率 var ff = new { name = "张三", age = 19 };//这种叫 匿名对象 语法:var 变量名 = { }; Console.WriteLine(ff.name); Console.WriteLine("------------------"); //对象集合初始化器 List<string> fruits = new List<string>() { "苹果", "香蕉", "西瓜" }; fruits.Add("蜜罐"); Console.Write("请输入水果名:"); string str = Console.ReadLine(); //原来的做法(赋值查询)foreach来遍历输出 foreach (var itme in fruits) { if (itme.Contains(str)) Console.WriteLine("你输入的水果:" + itme); } //linq语法:Select * from 数据源(表明) var reus = from f in fruits //数据源:也就是一个集合,遍历list orderby f descending //orderby排序(默认的升序) 跟 descending降序 (ascending升序) select f;//显示结果返回给reus变量,可查询字段(如果查询全部直接放变量名) 就像f是变量名 数据库字段 f.id 这种得到字段的所有值 Console.WriteLine("--------降序排列---------"); foreach (var itme in reus) { Console.WriteLine(itme); } List<Product> plist = new List<Product>() { new Product() { Id = 1, Name = "a冰箱", Price = 2300, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "苹果", "香蕉", "西瓜" }}, new Product() { Id = 1, Name = "b冰箱", Price = 2400, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "木瓜", "芒果", "地瓜" }}, new Product() { Id = 3, Name = "c冰箱", Price = 2500, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "橘子", "柿子", "水果" }}, new Product() { Id = 4, Name = "d冰箱", Price = 2600, Brand = "西门子", Sell = "B201",lover = new List<string>(){ "柚子", "香瓜", "西瓜" }} }; Console.Write("请输入商品名称:"); string name = Console.ReadLine(); Console.Write("请输入商品价格:"); string price = Console.ReadLine(); //linq语法 var reuslt = from f in plist//数据源:也就是一个集合,遍历list orderby f.Id, f.Name descending, f.Price //默认所有字段都是ascending升序排列 所以不写 然后某个加上descending变成降序 where (String.IsNullOrEmpty(name) || f.Name == name) && (String.IsNullOrEmpty(price) || f.Price == Convert.ToInt32(price)) select f;//显示结果返回给reuslt对象 IsNullOrEmpty用来表示name为空 前面加!不为空 Console.WriteLine("--------降序排列---------"); Show(reuslt.ToList());//显示数据的方法 //************************************************************************************************************************************* Console.Write("请输入爱好:"); string lovers = Console.ReadLine(); List<string> loverlist = lovers.Split(',').ToList();//根据用户输入爱好 ,号来划分字符串 //复合的from子句:可以解决多对多查询,查询条件是一个集合,数据源也是一个集合 var reuslt1 = from f in plist//数据源也是一个集合:使用复合子句把数据源集合变成一个一个的字符串 from loveritem in f.lover where loverlist.Contains(loveritem) //查询条件是一个集合 select f; Console.WriteLine("--------复合的from子句:爱好条件也可以是一个集合来查询---------"); Show(reuslt1.ToList());//显示数据的方法 //************************************************************************************************************************************* Console.WriteLine("--------复合Select子句查询单个字段---------"); var reuslt2 = from f in plist//数据源 from loveritem in f.lover where loverlist.Contains(loveritem) select f.Name; //复合字句查询,单个字段不是全部字段 List<string> unamelist = reuslt2.ToList(); foreach (var item in unamelist) { Console.WriteLine(item); } //*************************************************************************************************************************************** Console.WriteLine("--------复合Select子句查询多个字段:---------"); var reuslt3 = from f in plist//数据源 from loveritem in f.lover where loverlist.Contains(loveritem) select new { //复合字句查询,多字段 a = f.Id, b = f.Name, c = f.Price }; foreach (var item in reuslt3) { Console.WriteLine("编号:{0},产品名:{1},价格:{2}", item.a, item.b, item.c); } Console.ReadLine();//用来暂定 } } /// <summary> /// 实体类,网上没有太多解释,我认为解释处理数据的一个载体,prop快速生成字段 /// </summary> public partial class Product { //构造方法:与类同名,且没有返回值。作用:初始化类的成员。运行时:创建对象(new)的时候就会执行构造方法 /// <summary> /// 有参构造方法:这种写发相当于 调用时候 new Product(){}对象 一般用作初始化值 可以这样,调用的时候赋值给他 new Product(1,"洗衣机",999,"格力","B301") /// </summary> public Product(int Id, string Name, int Price, string Brand, string Sell) { this.Id = Id; this.Name = Name; this.Price = Price; this.Brand = Brand; this.Sell = Sell; } /// <summary> /// 无参构造方法:每个类默认都是有一个“无参构造”,但是类中定义了其他构造,默认的无参构造将不存在,因此必须重新在写一次,说明了构造方法是可以方法重载的。 /// </summary> public Product() { Console.WriteLine("方法重载:同一个类中【只要方法名相同,参数列表不同】,不关心其他因素,不管有没有返回值都叫方法重载。"); } ~Product() { Console.WriteLine("析构方法:与类同名,语法 ~类名(){}的方法,不需要被调用。运行时:在类被实例化对象,完成一系列操作后,会执行析构方法里面的代码"); } public Nullable<int> Id { get; set; } //Nullable<int>表示值类型也可以赋空值 int? id = null 就不会不错 一般来说int是没有空值 string有 public string Name { get; set; } public int? Price { get; set; } // int? 是 Nullable<int> 的简化 ,不限制值类型,其他类型也可以用 除了字符串本身就可以有空值外加他没意义 public string Brand { get; set; } public string Sell { get; set; } } /// <summary> /// 分部类:关键字 partial【部分】的意思,对应的类名要一样,指定其实就是一个类了 /// 作用:一个类分成几个来写,最终合并到一起,在asp.net经常看到,对我们代码太多一个类写不下来,就会用 partial 把多类合并起来 /// </summary> public partial class Product { public List<string> lover { get; set; }//调用Product类时就可以使用上面字段也可以使用这个字段,都是同一个类,是合并类 } }