首页 > Linq 对List的一些操作

Linq 对List的一些操作

代码:

    public class Person{public int ID { get; set; }public string Name { get; set; }public int Age { get; set; }       }public class Dog{public int ID { get; set; }public string Name { get; set; }public int PersonID { get; set; }}public class DogClothes{public int ID { get; set; }public string Name { get; set; }public int DogID { get; set; }}public class ActionPerson{ public List GetPersons(){List list = new List();for (var i = 0; i < 10; i++){Person p = new Person {ID=i+1, Name = "hongda" + (i + 1), Age = 26 + i };list.Add(p);}return list;}public List GetDogs(){List dogs = new List();for (var i = 1; i < 15; i++){Dog dog = new Dog { ID = i, Name = "dogs" + i, PersonID = (i %5)+1 };dogs.Add(dog);}return dogs;}public List GetDogClotheses(){List DogClothes = new List();for (var i = 1; i < 13; i++){DogClothes clothes = new DogClothes() { ID = i, Name = "DogClothes" + i, DogID = (i % 4) + 2 };DogClothes.Add(clothes);}return DogClothes;}public void Show(List list){foreach (var l in list){ShowObj(l);}}public void ShowObj(T data){Type t = data.GetType();PropertyInfo[] infos = t.GetProperties();StringBuilder strBuilder = new StringBuilder();foreach (var p in infos){object value = p.GetValue(data, null);string name = p.Name.ToString();strBuilder.Append(name + ":" + value + ",");}Console.WriteLine(strBuilder.ToString());}}

 

对list操作

上面的代码可以不看,反正就是一些临时用的数据

ActionPerson ap = new ActionPerson();List list = ap.GetPersons();ap.Show(list);Console.WriteLine("========================================");List dogs = ap.GetDogs();ap.Show(dogs);Console.WriteLine("========================================");

上面的是list,下面的是dogs

ap(dogClothes);

 1.取有狗的人

 var list2 = from a in list from b in dogs where a.ID == b.PersonID select a;ap.Show(list2.ToList());Console.WriteLine("========================================");ap.Show(list2.Distinct().ToList());Console.WriteLine("========================================");

发现,自连接就是左表一条条数据与右表一条条数据交叉,取得符合条件的(a.ID==b.PersonID),再取得需要的字段(a),不会自动合并。

看这个就清楚了

var list4 = from a in list from b in dogs where a.ID == b.PersonID select new { a.ID, a.Name, a.Age, DogsID = b.ID, DogsName = b.Name };ap.Show(list4.ToList());

这样上面的就不要区分(distinct)了,之后再取需要的字段

2.join

  var list2 = from a in list join b in dogs on a.ID equals b.PersonID into c select new { a.ID, a.Name, a.Age,Count=c.Count() };ap.Show(list2.ToList());

 在上面这种into一个对象时,会发现b不能够调用了,a还是可以使用的,当然新形成的对象c也可以,c有一些特殊的属性,例如count

            var list2 = from a in list join b in dogs on a.ID equals b.PersonID select new { a.ID, a.Name, a.Age, DogsID = b.ID, DogsName = b.Name, b.PersonID };

 var list2 = from a in list join b in dogs on a.ID equals b.PersonID select new { a.ID, a.Name, a.Age };ap.Show(list2.ToList());

跟自连接一样

 LINQ TO SQL中的join,如果带有into,可以提前对表进行过滤条件的操作,而不用等到两表进行迪卡尔积产生虚似表后再进行join on的条件过滤。

 关于left join

 var list2 = from a in listjoin b in dogs on a.ID equals b.PersonID into cfrom o in c.DefaultIfEmpty()select new{a.ID,a.Name,a.Age,DogsID =o==null?0: o.ID,DogsName = o == null ? "" : o.Name,PersonID=o==null?0:o.PersonID };

 在数据库中就不需要这么复杂,这里list中要考虑右侧可能为空,

数据库查询就不需要。

 多查询

  static void Main(string[] args){ActionPerson ap = new ActionPerson();List list = ap.GetPersons();List dogs = ap.GetDogs();List dogClotheses = ap.GetDogClotheses();var result = from a in listjoin b in dogson a.ID equals b.PersonIDjoin c in dogClotheseson b.ID equals c.DogIDselect new{a.ID ,a.Name ,a.Age,DogID=b.ID ,DogName=b.Name,b.PersonID ,DogClothesID=c.ID,DogClothesName=c.Name ,DogID2=c.DogID };ap.Show(result.ToList ());                   Console.ReadLine();}

 

   var result = from a in listfrom b in dogsfrom c in dogClotheseswhere a.ID == b.PersonID && b.ID == c.DogIDselect new{a.ID,a.Name,a.Age,DogID = b.ID,DogName = b.Name,b.PersonID,DogClothesID = c.ID,DogClothesName = c.Name,DogID2 = c.DogID };

结果上同

http://developer.51cto.com/art/200909/152189.htm

http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html

更多相关:

  • 练习:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式------------ info of Egon -----------Name  : EgonAge   : 22Sex   : maleJob   : Teacher ------------- end -----------------完成情况:in_name=inpu...

  •   语法 它通过{}和:来代替%。 “映射”示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kzc',18) Out[2]: 'kzc,18' In [3]: '{1},{0},{1}'.forma...

  • --------------------------------------------------------------------------------------- 本系列文章为《机器学习实战》学习笔记,内容整理自书本,网络以及自己的理解,如有错误欢迎指正。 源码在Python3.5上测试均通过,代码及数据 --> http...

  • 首先运行easy_install pymongo命令安装pymongo驱动。然后执行操作: 创建连接 1 In [1]: import pymongo 2 3 In [2]: connection = pymongo.Connection('localhost', 27017) 切换到数据库malware In [3]: db...

  • 在.Net Framework中,配置文件一般采用的是XML格式的,.NET Framework提供了专门的ConfigurationManager来读取配置文件的内容,.net core中推荐使用json格式的配置文件,那么在.net core中该如何读取json文件呢?1、在Startup类中读取json配置文件1、使用Confi...

  •   1 public class FrameSubject extends JFrame {   2    3   …………..   4    5   //因为无法使用多重继承,这儿就只能使用对象组合的方式来引入一个   6    7   //java.util.Observerable对象了。   8    9   DateSub...

  • 本案例主要说明如何使用NSwag 工具使用桌面工具快速生成c# 客户端代码、快速的访问Web Api。 NSwagStudio 下载地址 比较强大、可以生成TypeScript、WebApi Controller、CSharp Client  1、运行WebApi项目  URL http://yourserver/swagger 然后...

  •   在绑定完Action的所有参数后,WebAPI并不会马上执行该方法,而要对参数进行验证,以保证输入的合法性.   ModelState 在ApiController中一个ModelState属性用来获取参数验证结果.   public abstract class ApiController : IHttpController,...

  • 1# 引用  C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.dll C:AVEVAMarineOH12.1.SP4Aveva.ApplicationFramework.Presentation.dll 2# 引用命名空间, using Aveva.Applicati...

  • 菜鸟一枚,正在学习C++ Gui Qt4,整理很零碎,欢迎批评指正   1.窗口标题: QWidget *window = new QWidget; window->setWindowTitle("Enter Your Age"); **************************************** 关于标题...

  • 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 总体思路是: 比较两个链表头节点,较小的插入新链表指针之后,同时较小链表指针向后移动一位 实现如下: ListNode* mergeTwo...

  • 1.直接调用微软socket对象处理 static void Main(string[] args){try{IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });//在3721端口新建一个TcpListener对象TcpListener listener = new...

  •   现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线。   ZK有一个功能,就是创建临时节点,当机器启动应用的时候就会连接到一个ZK节点,然后创建一个临时节点,那么通过获取监听该路径,并且获取该路径下的节点数量就知道有哪些服务...

  • 前台到后台java时data日期类型的转化 在实体类中用@DataTimeFormat,这样设置即使传过来是空的字符串也是可以转的,要和前面传过来的格式一致,如 @XmlElement(name="BeginDate") @DateTimeFormat(pattern="yyyy-MM-dd") private Date begin...