【发布时间】:2018-02-28 04:47:24
【问题描述】:
这两种使用 LINQ 执行左外连接的方法有什么区别,因为我都使用两个买家和供应商列表,并通过一个公共区域将它们连接起来以查找位于同一区域的供应商和买家。
class Supplier
{
public string Name { get; set; }
public string District { get; set; }
}
class Buyer
{
public string Name { get; set; }
public string District { get; set; }
}
List<Buyer> buyers = new List<Buyer>()
{
new Buyer() { Name = "Johny", District = "Fantasy District" },
new Buyer() { Name = "Peter", District = "Scientists District" },
new Buyer() { Name = "Paul", District = "Fantasy District" },
new Buyer() { Name = "Maria", District = "Scientists District" },
new Buyer() { Name = "Joshua", District = "EarthIsFlat District" },
new Buyer() { Name = "Sylvia", District = "Developers District" },
new Buyer() { Name = "Rebecca", District = "Scientists District" },
new Buyer() { Name = "Jaime", District = "Developers District" },
new Buyer() { Name = "Pierce", District = "Fantasy District" }
};
List<Supplier> suppliers = new List<Supplier>()
{
new Supplier() { Name = "Harrison", District = "Fantasy District" },
new Supplier() { Name = "Charles", District = "Developers District" },
new Supplier() { Name = "Hailee", District = "Scientists District" },
new Supplier() { Name = "Taylor", District = "EarthIsFlat District" }
};
第一:
var suppliersAndBuyers = from s in suppliers
orderby s.District
join b in buyers on s.District equals b.District into buyersGroup
select buyersGroup.DefaultIfEmpty(
new Buyer()
{
Name = string.Empty,
District = s.District
});
foreach (var item in suppliersAndBuyers)
{
foreach (var buyer in item)
{
Console.WriteLine($"{buyer.District} {buyer.Name}");
}
}
第二种方法:
var suppliersAndBuyers = from s in suppliers
orderby s.District
join b in buyers on s.District equals b.District into buyersGroup
from bG in buyersGroup.DefaultIfEmpty()
select new
{
Name = bG.Name == null ? string.Empty : bG.Name,
s.District,
};
foreach (var item in suppliersAndBuyers)
{
Console.WriteLine($"{item.District} {item.Name}");
}
两者都产生完全相同的输出,是我们输出结果方式的唯一区别吗?我应该使用哪一个?
编辑:第一种方法返回IEnumerable<IEnumerable<Buyer>>,第二种方法返回IEnumerable<AnonymousType>,这是两者在返回类型方面唯一有意义的区别,这是两者之间的唯一决定因素两种方法,我想要一个类型还是匿名类型?
【问题讨论】:
-
提示:
Name = bG.Name == null ? string.Empty : bG.Name->Name = bG.Name ?? "". -
这是对数据库调用有何影响的假设,还是仅在内存中。
-
@Igor 我正在研究 LINQ atm,所以我没有真正的场景,我正在关注 MSDN 网站上的加入示例,看到了这两种方法,应用了它们,但无法找出区别。
-
第二次,您再次遍历您的可枚举对象,再次构造所有对象。就个人而言,我总是更喜欢第一个。但是,我也相信它在创建许多空对象并且只是不使用它们时确实使用了不需要的额外内存......
-
@YotamSalmon 有道理,为什么第一个返回 IEnumerable
> 而不仅仅是 IEnumerable ?