【发布时间】:2022-01-22 07:50:49
【问题描述】:
public class Factory
{
public string Number { get; set; }
public List<OrganizationUnit> Units;
}
public class OrganizationUnit
{
public string Name { get; set; }
public string Id { get; set; }
public bool ?IsActive { get; set; }
}
public static class LocalisationRepo
{
public static List<Factory> GetFactories()
{
List<Factory> fa = new List<Factory>();
Factory factory = new Factory() { Number="F10", Units = new List<OrganizationUnit> {
new OrganizationUnit()
{ Id = "001", Name = "Quality", IsActive = false},
new OrganizationUnit() { Id = "002", Name = "Line 3", IsActive=null } ,
new OrganizationUnit { Id="003", Name="IT", IsActive=true } } };
Factory factory2 = new Factory()
{
Number = "F11",
Units = new List<OrganizationUnit> {
new OrganizationUnit()
{ Id = "001", Name = "Quality", IsActive = true},
new OrganizationUnit() { Id = "002", Name = "Line 3", IsActive=true } ,
new OrganizationUnit { Id="003", Name="IT", IsActive=true } }
};
fa.Add(factory);
fa.Add(factory2);
return fa;
}
}
有一个 linq 查询
var factories = LocalisationRepo.GetFactories();
var fa = factories.SelectMany(f => f.Units.Where(u => (u.IsActive ?? false) == false), (f, u) => f).Distinct();
foreach (var item in fa)
{
Console.WriteLine(item.Number);
}
第一部分f => f.Units.Where(u => (u.IsActive ?? false) == false)
给我们IEnumerable<OrganizationUnit>
第二个参数(f, u) => f(应用于中间序列每个元素的变换函数)
"将序列的每个元素投影到IEnumerable<Out T>"
我的问题是当第一个参数的“输出”为IEnumerable<OrganizationUnit> 时,此选择器/委托如何从IEnumerable<OrganizationUnit> 转换为IEnumerable<Factory>
应该如何考虑/理解?
我们知道 f 是一个工厂,但“中间结果”是 OrganizationUnit 所以......如何?关于函数编程的一些理论?
我想要具有非活动 OrganisationUnits IsActive=false 的工厂; 但我不是在问如何查找结果,因为我的示例运行良好。 我想知道它是如何工作的,以及为什么......
同微软示例https://docs.microsoft.com/en-US/dotnet/api/system.linq.enumerable.selectmany?view=net-6.0
我们可以查询 变种查询 = 宠物主人 .SelectMany(po => po.Pets.Where(p => p.StartsWith("S")), (po, p) => po);
【问题讨论】:
-
你到底想做什么?我不认为您以您认为的方式使用
SelectMany。您是否尝试将项目投射到新的工厂列表中,并且只使用那些处于活动状态的单位? -
工厂方法应该是
Func<TInput, TOutput>。从我所看到的,我什至不明白你想要达到什么目的。OrganizationUnit应该如何翻译成Factory类? -
我修改了示例。所以你现在可以检查一下,我想要具有非活动组织单位 IsActive=false 的工厂会更清楚;但我不是在询问如何查找结果,因为我的示例运行良好。我想知道它是如何工作的,以及为什么......
-
“我的例子工作正常”你确定吗?您是否只想要具有符合条件的单位的工厂的 ID,或者您正在寻找其他东西?