虽然List里的linq方法(其实是Enumarable的)大部分比较简单 ,但是如果能够灵活运用也是提高code质量,可读性和coding能力的有效途径。而且其中有些方法,例如 Join, 光看注释可能会有点懵。 最近把他们go through了一遍。代码如下。

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Linq;using System.Collections.ObjectModel;using System.Collections;

namespace ListMethodTest{

public class TestItem    {public int number { get; set; }public string str { get; set; }

//used for SelectMany        public List<string> children { get; set; }

public override int GetHashCode()        {return number;        }    }

public class InnerClass    {public int id { get; set; }public string name { get; set; }    }

public class ChildTestItem : TestItem    { }

public class ConvertTest    {public int a { get; set; }    }

public partial class _Default : System.Web.UI.Page    {        List<TestItem> lst1 = new List<TestItem>();protected void Page_Load(object sender, EventArgs e)        {

            lst1.Add(new TestItem() { number = 3, str = "dsdfsf", children = new List<string>() { "c1", "c2" } });            lst1.Add(new TestItem() { number = 1, str = "csdfsdf", children = new List<string>() { "c3", "c4" } });            lst1.Add(new TestItem() { number = 2, str = "aasdfsdf" });            lst1.Add(new TestItem() { number = 2, str = "222" });

int part = 3;switch (part)            {case 1: Part1();break;case 2: Part2(); break;case 3: Part3(); break;default: break;            }        }

private void Part3()        {int sum = lst1.Sum(x => x.number);            List<TestItem> take = lst1.Take(3).ToList();

//同样 take前面的             List<TestItem> takewhile = lst1.TakeWhile(x => x.number == 3).ToList();

//key必须唯一// Dictionary<int,TestItem> toDic=   lst1.ToDictionary(x => x.number);

//Ilookup:IEnumerable<TElement> this[TKey key] { get; }   所以可以有重key            ILookup<int, TestItem> lookup = lst1.ToLookup(x => x.number);

//lst1.TrimExcess();

bool trueforall = lst1.TrueForAll(x => x.number > -1);

            List<TestItem> where = lst1.Where(x => x.number == 2).ToList();

        }

void Part2()        {// 里面的 item和原来的是一个引用,即便 不重写GetHashCode            List<TestItem> getR = lst1.GetRange(1, 2);

            IEnumerable<IGrouping<int, TestItem>> gb = lst1.GroupBy(x => x.number);

int io = lst1.IndexOf(lst1[1]);

            lst1.Insert(0, new TestItem() { number = 0, str = "00" });

            List<TestItem> toInsert = new List<TestItem>()            {new TestItem() { number = 0, str = "InsertRange0"},new TestItem() { number = 2, str = "InsertRange1" },new TestItem() { number = 9, str = "InsertRange2" },            };//lst1.InsertRange(0, toInsert);

//返回 lst1中与  toInsert 相等的 元素             List<TestItem> Intersect = lst1.Intersect(toInsert, new DistinctTest()).ToList();

            List<InnerClass> inner = new List<InnerClass>() { 

new InnerClass(){ id=1, name="name1"},new InnerClass(){ id=2, name="name2"},new InnerClass(){ id=3, name="name3"},

            };

// 2个list的 TKEY 类型必须一致, 返回 key相等的组合 ,其实就是 key相等的 inner join// 最后一个委托只是根据组合 生成 返回的结果            IEnumerable join = lst1.Join(inner, x => x.number, i => i.id, (a, b) => new { a.number, a.str, b.id, b.name });

// 类似  dictionary,    lst1为key, 匹配的 InnerClass 的集合为value ,即使集合count为0(没有匹配) ,也会组合            IEnumerable gj = lst1.GroupJoin(inner, x => x.number, i => i.id, (a, b) => new { id = a.number, name = a.str, lst = b });

            IEnumerable zip = lst1.Zip(inner, (x, y) => new { x.number, x.str, y.id, y.name });

            TestItem last = lst1.Last(x => x.number == 2);

int lindex = lst1.LastIndexOf(lst1[2]);

int max = lst1.Max(x => x.number);int min = lst1.Min(x => x.number);

//lst1.Add(new ChildTestItem());//IEnumerable<ChildTestItem>   ot=  lst1.OfType<ChildTestItem>();

            List<TestItem> ob = lst1.OrderBy(x => x.str).ToList();

//lst1.Sort((a, b) => {//        if( a.number< b.number)  return -1;//        else if( a.number == b.number) return 0;//        else return 1;//    } );

// TestItem temp =lst1[0];// bool remove = lst1.Remove(temp);

// int  ra=    lst1.RemoveAll(x => x.number == 2);

// lst1.RemoveAt(2);

//lst1.RemoveRange(2, 2);

//lst1.Reverse();

// select 是变形用的 ,这个词太唬人了,别被他的外表所蒙蔽            IEnumerable select = lst1.Select(x => new { id = x.number, name = x.str, g = Guid.NewGuid() });            IEnumerable select1 = lst1.Select((x, y) => new { id = x.number, name = x.str, index = y, g = Guid.NewGuid() });//flatten            IEnumerable SelectMany = lst1.SelectMany(x => x.children == null ? new List<string>() : x.children);

            List<TestItem> s1 = new List<TestItem>()           {new TestItem(){  number=1 ,str="sdf" }           };

            List<TestItem> s2 = new List<TestItem>()           {new TestItem(){  number=1  }           };

//个数不一样肯定 false            bool se = s1.SequenceEqual(s2, new DistinctTest());

            List<TestItem> union = s1.Union(s2).ToList();

//不single的话 throw exception//TestItem singe = lst1.Single(x => x.number ==2);

            List<TestItem> skip = lst1.Skip(2).ToList();//注意 bypass   前面的element            List<TestItem> SkipWhile = lst1.SkipWhile(x => x.number == 0).ToList();

        }

void Part1()        {//  ( (item 1,2 的结果 )  和item 3的结果)和item 4的结果            TestItem agg = lst1.Aggregate((i, j) => { i.number += j.number; return i; });

bool all = lst1.All(i => i.str.Contains("c"));

bool any = lst1.Any(i => i.str.Contains("c"));

            ParallelQuery p = lst1.AsParallel();

            IQueryable<TestItem> q = lst1.AsQueryable();

var query = from ti in q where ti.number == 2 select ti;

            ReadOnlyCollection<TestItem> readonlylst = lst1.AsReadOnly();

double average = lst1.Average(i => i.number);

int index = lst1.BinarySearch(new TestItem() { number = 1, str = "123123" }, new CompareClass());

//如果lst1是非泛型的集合 ,转换之后就可以用泛型的方法啦! where, any ,select , all等            IEnumerable<TestItem> castedLst = lst1.Cast<TestItem>();

            List<TestItem> lsttoConcat = new List<TestItem>() { new TestItem() { number = 4 } };            List<TestItem> concatedLst = lst1.Concat(lsttoConcat).ToList();

            TestItem t = new TestItem() { number = 4 };            lst1.Add(t);//bool contains = lst1.Contains<TestItem>(t);            bool contains = lst1.Contains<TestItem>(new TestItem() { number = 4 });//bool contains = lst1.Contains<string>("sdfsdf");   it's wrong!

            List<ConvertTest> convertedLst = lst1.ConvertAll(i => new ConvertTest() { a = i.number });

            TestItem[] arr = new TestItem[10];            lst1.CopyTo(arr, 3);

//下面defLst count 为 0            IEnumerable<TestItem> defLst = lst1.DefaultIfEmpty();

            IEnumerable<TestItem> dsicLst = lst1.Distinct();

            lst1.Add(new TestItem() { number = 4, str = "sdfsd" });            IEnumerable<TestItem> dsicLst1 = lst1.Distinct<TestItem>(new DistinctTest());

            TestItem elementat = lst1.ElementAt(1);            TestItem elementatORDefault = lst1.ElementAtOrDefault(10);

            List<TestItem> toexcept = new List<TestItem>()            {                lst1[2],                lst1[3]

            };

            IEnumerable<TestItem> exceptedLst = lst1.Except(toexcept);

bool exist = lst1.Exists(i => i.number == 4);

            TestItem find = lst1.Find(i => i.number == 4);

            List<TestItem> findall = lst1.FindAll(i => i.number == 4);

int fIndex = lst1.FindIndex(i => i.number == 4);

            TestItem fLast = lst1.FindLast(i => i.number == 4);

int lastIndex = lst1.FindLastIndex(i => i.number == 4);

            TestItem first = lst1.First(x => x.number == 4);

            lst1.ForEach(x => x.str = x.number == 4 ? "4" : x.str);        }

    }

public class DistinctTest : IEqualityComparer<TestItem>    {public bool Equals(TestItem x, TestItem y)        {if (x.number == y.number) return true;else return false;        }

public int GetHashCode(TestItem obj)        {//HashCode默认情况就是地址的散列码,跟散列算法有关系,所以默认情况不同对象的hashcode是不一样的,所以要重写TestItem的GetHashCode方法。//用最简单的方法来说,hashcode就是一个签名。当两个对象的hashcode一样时,两个对象就"有可能"一样。如果不一样的话两个对象就"肯定"不一样。            return obj.GetHashCode();        }    }

public class CompareClass : IComparer<TestItem>    {public int Compare(TestItem x, TestItem y)        {if (x.number < y.number) return -1;else if (x.number == y.number) return 0;else return 1;        }    }}

转载自:http://www.cnblogs.com/wangtian52127/archive/2012/03/30/2425482.html

转载于:https://www.cnblogs.com/zcm123/archive/2012/06/28/2567287.html

c# List 里面的Linq方法相关推荐

  1. Angularjs $scope 里面的$apply 方法 和 $watch 方法

    Angularjs $scope 里面的$apply 方法 和 $watch 方法 学习要点: 1. Angularjs $scope 里面的$apply 方法 2. Angularjs $scope ...

  2. 线程里面的yield();方法(让出线程)

    package thread;public class Thread_yield {public static void main(String[] args) {/*** 线程让出当前占用的处理器C ...

  3. Simple java里面的paint(Graphics g)的理解

    以前写画图板时,总不理解什么时候要调用这个方法,老师说:你写了paint(g)方法后,在窗体改变时,就会调用,可是不太理解. 没写paint(g)的演示:画图板v1 1:绘制简单直线 2.执行最小化操 ...

  4. oracle里面的terminate,c++  ooci  oracle中的ResultSet详解

    这篇文章并没有给出如何使用ResultSet的具体例子,只是从ResultSet的功能性上进行了详细的讲述.希望这篇文章对大家理解ResultSet能够有所帮助.下面就是这篇文章的具体内容. 结果集( ...

  5. Java并发学习(五)-LockSupport里面的park和unpark

    学习AQS源码时候,发现当判断队列需要入队挂起时,都是调用LockSupport里面的park和unpark方法,例如: //park并且检查是否中断 private final boolean pa ...

  6. java retry_java里面的retry:

    今天在看java线程池的源码的时候,看到ThreadPoolExecutor里面的addWork()方法有下图中的这种写法,因为之前没有见过,所以好奇研究了一下 首先这个retry不是java里面的关 ...

  7. 07 - java 方法里面的 return

    Java 方法里面的 return return 之函数返回值 public static int sum(a, b) {return a + b; } return 之结束方法 Scanner sc ...

  8. Vmware虚拟机里面的linux系统ping不通宿主机的解决方法(注意同时安装vmware和vbox虚拟机)

    Vmware虚拟机里面的linux系统ping不通宿主机的解决方法(注意同时安装vmware和vbox虚拟机) 参考文章: (1)Vmware虚拟机里面的linux系统ping不通宿主机的解决方法(注 ...

  9. 关于springboot访问不到static里面的js文件解决方法(仅供参考)

    关于springboot访问不到static里面的js文件解决方法(仅供参考) 遇到的问题 1.在html页面中引入jQuery文件后使用$符号会提示未被定义 2.静态资源无法访问 解决方法 1.$符 ...

  10. 关于Java里面的String.getBytes()方法

    关于Java里面的String.getBytes()方法 Java里面的String类型的编码方式是Unicode,根据你项目字符串的编码方式无关,这是写死的.但是如果你jvm平台使用的是GBK编码方 ...

最新文章

  1. 三周第三次课(11月1日) 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  2. Spring启动执行流程梳理
  3. nginx常用代理配置
  4. 节省3500万的背后,运维如何兼顾成本与效率?
  5. 蓝桥杯-出现次数最多的整数(java)
  6. 【TensorFlow官方文档】MNIST机器学习入门
  7. 二维码提升对比度文献调研(2)--Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement
  8. PL/SQL 之 sql语句的编写
  9. offload error: cannot find offload entry解决办法
  10. 撕掉单词书,每天花10分钟做这件事,英语水平暴涨!
  11. yum install php-pecl-mongo,pecl安装php mongodb扩展
  12. python学习笔记2---内置函数
  13. 求解函数优化问题的改进布谷鸟搜索算法
  14. Windows Terminal美化教程
  15. C#基础之vs2010安装与使用教程
  16. 机器学习与深度学习常见面试题
  17. 左斜杠和右斜杠的区别
  18. html5考试总结300字,期中考试总结
  19. IDEA社区版利用maven创建web
  20. 读《MySQL性能调优与架构设计》笔记之ORDER BY,GROUP BY 和DI STI NCT 优化

热门文章

  1. C语言中可变参数的宏 __VA_ARGS__
  2. Linux 火焰图(on-cpu , off-cpu , memory)
  3. netbeans使用教程
  4. Linux 进程地址空间1_数据结构和接口
  5. PROC文件及文件夹创建
  6. 云服务器怎么增加d盘_怎么租用美国云服务器比较便宜?
  7. linux 重启mysql_Grafana+Prometheus 监控 MySql服务
  8. 小 C 的数学(math)详解
  9. java 权重_java的权重匹配算法技术?
  10. 用VScode写html文件以及调用浏览器运行