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);
}
//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);
}
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);
}
}
}
}