var list1 = new List<(string s1, string s2)>()
{
("a","1"),
("b","2"),
("c","4"),
("e","1")
};
var list2 = new List<(string s1, string s2)>()
{
("i","1"),
("j","2"),
("l","1"),
("m","2"),
("n","3")
};
var q = from r1 in list1
join r2 in list2
on r1.s2 equals r2.s2 into result
from t in result
select t;
foreach (var item in q)
{
Console.WriteLine(item);
Console.WriteLine("------------");
}
输出:
(i, 1)
------------
(l, 1)
------------
(j, 2)
------------
(m, 2)
------------
(i, 1)
------------
(l, 1)
------------
再来看将result改为result.DefaultIfEmpty()后的代码:
var list1 = new List<(string s1, string s2)>()
{
("a","1"),
("b","2"),
("c","4"),
("e","1")
};
var list2 = new List<(string s1, string s2)>()
{
("i","1"),
("j","2"),
("l","1"),
("m","2"),
("n","3")
};
var q = from r1 in list1
join r2 in list2
on r1.s2 equals r2.s2 into result
from t in result.DefaultIfEmpty()
select t;
foreach (var item in q)
{
Console.WriteLine(item);
Console.WriteLine("------------");
}
输出:
(i, 1)
------------
(l, 1)
------------
(j, 2)
------------
(m, 2)
------------
(, )
------------
(i, 1)
------------
(l, 1)
------------
——————————————————————————————
再来看代码:
var list1 = new List<(string s1, string s2)>()
{
("a","1"),
("b","2"),
("c","4"),
("e","1")
};
var list2 = new List<(string s1, string s2)>()
{
("i","1"),
("j","2"),
("l","1"),
("m","2"),
("n","3")
};
var q = from r1 in list1
join r2 in list2
on r1.s2 equals r2.s2 into result
from t in result
select (s1:r1.s1,t:t);
foreach (var item in q)
{
Console.WriteLine(item.s1);
Console.WriteLine(item.t);
Console.WriteLine("------------");
}
输出:
a
(i, 1)
------------
a
(l, 1)
------------
b
(j, 2)
------------
b
(m, 2)
------------
e
(i, 1)
------------
e
(l, 1)
------------
再来看将result改为result.DefaultIfEmpty()后的代码:
var list1 = new List<(string s1, string s2)>()
{
("a","1"),
("b","2"),
("c","4"),
("e","1")
};
var list2 = new List<(string s1, string s2)>()
{
("i","1"),
("j","2"),
("l","1"),
("m","2"),
("n","3")
};
var q = from r1 in list1
join r2 in list2
on r1.s2 equals r2.s2 into result
from t in result.DefaultIfEmpty()
select (s1:r1.s1,t:t);
foreach (var item in q)
{
Console.WriteLine(item.s1);
Console.WriteLine(item.t);
Console.WriteLine("------------");
}
输出:
a
(i, 1)
------------
a
(l, 1)
------------
b
(j, 2)
------------
b
(m, 2)
------------
c
(, )
------------
e
(i, 1)
------------
e
(l, 1)
------------
这段代码就是左外连接