Linq function commissions manual simulation to realize where function, linq uses

Linq function commissioned simulation, use

First, the where method similar to linq uses the Func <> delegate to achieve

1. First define the node information

 public class Node
    {
        //public static List<Node> nodes = new List<Node>();
        public int num;
        public string name;
    }

    public class Node2
    {
        public int id;
        public int age;
    }

2. Define the simplest where function simulation

public static class Linq_base
    {
        //基础版本
        public static List<Node> ZhaWhere(this List<Node> temp, Func<Node, bool> func)  
        {
            List<Node> node = new List<Node>();
            foreach (var tt in temp)
            {

                if (func.Invoke(tt))
                {
                    node.Add(tt);
                }
            }
            return node;



        }

3. Generic

 //泛型实现
        public static List<T> ZhaWhere2<T>(this List<T> temp, Func<T, bool> func)    
        {
            List<T> node = new List<T>();
            foreach (var tt in temp)
            {

                if (func.Invoke(tt))
                {
                    node.Add(tt);
                }
            }
            return node;
        }

4. Iterator

public static IEnumerable<T> ZhaWhere3<T>(this IEnumerable<T> temp, Func<T, bool> func)    //泛型实现
        {
            
            foreach (var tt in temp)
            {

                if (func.Invoke(tt))
                {
                   yield return (tt);
                }
            }
           
        }

Call the above stuff

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Linq_Zha
{
    class Program
    {

        static void Main(string[] args)
        {
            List<Node> nodes = new List<Node>()
            {
                new Node()
                {
                    num=1,
                    name="a"

                },
                new Node()
                {
                    num=3,
                    name="a"
                },
                new Node()
                {
                    num=2,
                    name="b"
                },
                new Node()
                {
                    num=5,
                    name="d"
                },
                new Node()
                {
                    num=5,
                    name="a"
                }
            };

            Console.WriteLine("*********基础版本************");
            //基础版本
            var temp = nodes.ZhaWhere((o) =>
            {
                return o.num > 2;       //大括号的一定要记得ruturn 老是忘记  or o=>o.num>2
            });
            foreach (var t in temp)
            {
                Console.WriteLine(t.num);
                Console.WriteLine(t.name);
            }

            Console.WriteLine("*********泛型版本************");
            //泛型
            var temp2 = nodes.ZhaWhere2<Node>((o) => {
                return o.name == "a";

            });
            foreach (var t in temp2)
            {
                Console.WriteLine(t.num);
                Console.WriteLine(t.name);
            }

            Console.WriteLine("*********迭代器版本***********");
            //迭代器
            var temp3 = nodes.ZhaWhere3<Node>(o => o.num < 3);
            Console.WriteLine(temp3.Count() + "个");
            foreach (var t in temp3)
            {
                Console.WriteLine(t.num);
                Console.WriteLine(t.name);
            }
			

Insert picture description here

//linq
            Console.WriteLine("*********Linq版本************");
            var temp4 = nodes.Where<Node>((o) => {

                return (o.num == 1 | o.num == 3);
            });
            foreach (var t in temp4)
            {
                Console.WriteLine(t.num);
                Console.WriteLine(t.name);
            }

            Console.WriteLine("*********Linq进阶版本************");
            var temp5 = nodes.Where<Node>((o) => {
                if (o.num <= 6)
                {
                    if (o.name == "a")
                    {
                        return true;
                    }
                }
                return false;

            }).Select((ss) => new {   //筛选并成为新的匿名类
                id = ss.num
            }).OrderByDescending(o => o.id);   //反序

            foreach (var t in temp5)
            {
                Console.WriteLine(t.id);

            }


            Console.WriteLine("*********GroupBy版本************");
            var temp6 = nodes.GroupBy(o => o.num).Select((o) => new
            {
                id = o.Key,
                Max = o.Max(t => t.name)  //该组的某某东东

            });


            foreach (var t in temp6)
            {
                Console.WriteLine(t.id);
                Console.WriteLine(t.Max);
                //Console.WriteLine(t.name);
            }


           

Insert picture description here

 Console.WriteLine("*********join版本************");
            //join
            List<Node2> node2s = new List<Node2>()
            {
                new Node2()
                {
                    id=1,
                    age=18
                },
                new Node2()
                {
                    id=1,
                    age=19
                },
                new Node2()
                {
                    id=1,
                    age=20
                },
                new Node2()   //上面有两个num5 就加入到两个内
                {
                    id=5,
                    age=30
                },
                new Node2()   //上面没有num为6 所以不加入
                {
                    id=6,
                    age=666
                }

            };

            var list = from ss in nodes
                       join ss2 in node2s on ss.num equals ss2.id
                       select new
                       {
                           zid = ss.num,
                           zname = ss.name,
                           zage = ss2.age
                       };
            var list2 = nodes.Join(node2s, o => o.num, s => s.id, (o, s) => new   //和上面等同
            {
                zid = o.num,
                zname = o.name,
                zage = s.age

            });

            foreach (var t in list)
            {
                Console.WriteLine(t.zid);
                Console.WriteLine(t.zname);
                Console.WriteLine(t.zage);
                //Console.WriteLine(t.name);
            }

        }
    }
}

Insert picture description here

Published 27 original articles · praised 1 · visits 1673

Guess you like

Origin blog.csdn.net/qq_37959151/article/details/105230929