using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lamda
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 测试数据
            List<Student> list = new List<Student>()
        {
        new Student(){ ID=1, Name="jack", Age=20},
        new Student(){ ID=2, Name="mary", Age=21},
        new Student(){ ID=3, Name="joe", Age=22},
         new Student(){ ID=4, Name="joe", Age=22},
        new Student(){ ID=5, Name="Aaron", Age=23},
          new Student(){ ID=6, Name="Aaron", Age=24},
        };
            var a = list.Where((x, i) => list.FindIndex(z => z.ID == x.ID) == i);
            #endregion
            //1、获取list实体某一字段最大值
            var maxvalue = list.Max(p => p.ID);//4
            //2、获取list实体某一字段最小值
            var minvalue = list.Min(p => p.ID);//1
            //3、获取list实体某一字段总和的平均值
            var sumvalue = list.Sum(p => p.ID);//10
            //4、获取list实体某一字段总和的平均值
            var village = list.Average(p => p.ID);//2.5
            //5、判断list实体字段是否包含值
            var Iscon = list.Where(p => p.Name == "jack" && p.Age == 22).Any();//false  //是否存在名字为jack,年龄在2岁的人
            //6、list实体转成DICTIONARY 键值对
            var dic = list.Distinct().ToDictionary(p => p.ID, p => p.Name);
            //7、按照某一字段进行分组并获取对应字段的值
            var group = list.GroupBy(p => p.Name).Select(p =>p.Key).ToList();
            //7.1根据某一个字段的值去重
            var group2 =list.GroupBy(p => p.Name).Select(p =>p.First()).ToList();
           //8、根据某一字段获取list实体中重复的数据
           var duplicatevalue = list.GroupBy(p => p.Name).Where(g => g.Count() > 1).Select(p => p.Key).ToList();
           //已知Name字段值中有重复值,根据Name字段查出重复值 
           var sbarry = string.Join("','", duplicatevalue.ToArray()); 
           var sdk = list.Where(p => sbarry.Contains(p.Name)).ToList();//找出符合条件的值重复的数据 
         //9、根据某一字段获取list实体中重复的数据 
        var data2 = list.Where(p => list.Count(x => x.Name == p.Name) > 1).ToList();//找出符合条件的值重复的数据(这种方法比上8的好处是直接就可以查出实体) 
        int number = 5 - 1; 
        var data = list.Where(p => list.Count(x => x.Name == p.Name) >= number).ToList();//统计重复数据是5条以上的 
       //10、只获取list实体部分字段的值 
       var PartList = list.Select(p => new { p.Name, p.ID}).ToList(); 
       var PartList2 = list.Where(p => p.ID==1).Select(p => new { p.Name, p.ID }).ToList(); 
       var r = PartList2.Select(p => p.ID).FirstOrDefault(); foreach (var item in PartList2) { } 
       //11、只获取list实体部分字段的值 
        var PartList3 = list.Select(p => new Student2 { Name = p.Name, ID = p.ID }).ToList(); 
} 
} 
public class Student2 { public int ID { get; set; } public string Name { get; set; } } public class Student { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } }
 
 
//根据某一字段值获取最大值
            List<testLambdaMax> lmax = new List<testLambdaMax>{
            new testLambdaMax(){Id=1,Name="A"},
            new testLambdaMax(){Id=2,Name="B"},
            new testLambdaMax(){Id=3,Name="C"},
            new testLambdaMax(){Id=4,Name="D"}
        };
     
            var b = lmax.OrderByDescending(t => t.Id).Select(p => p.Name).FirstOrDefault();
//根据list实体中某一字段值去重
            List<Test> t = new List<Test>() {
                new Test(){id=1,name="车辆"},
                new Test(){id=2,name="车辆"},
                new Test(){id=3,name="飞机"},
                new Test(){id=4,name="火车"},
                new Test(){id=4,name="火车"},
            };
            var q = t.Where(d1 => t.Count(d2 => d2.name == d1.name) > 1).Distinct().ToList();