c# - 使用 LINQ,其中一个对象属性的值为 x,我如何在不同的属性中返回值
问题描述
我有一个对象,我试图查询使用 LINQ 的实例。如果对象的一个属性具有给定值,我需要返回另一个属性的值
我的构造函数如下:
public Job(string organisationType, string contractingOrganisationType, int levelNumber, string
jobName, int jobNumberOnLevel, string jobExecutor, int stepCount, int customInputCount, int
customOutputCount)
{
OrganisationType = organisationType;
ContractingOrganisationType = contractingOrganisationType;
LevelNumber = levelNumber;
JobName = jobName;
JobNumberOnLevel = jobNumberOnLevel;
JobExecutor = jobExecutor;
StepCount = stepCount;
CustomInputCount = customInputCount;
CustomOutputCount = customOutputCount;
}
几个模拟实例如下所示:
List<Job> JobList = new List<Job>();
JobList.Add(new Job("Owner" , null , 0, "ProjectBriefCreation" , 1, "ProjectOwner" , 5, 2, 2));
JobList.Add(new Job("GeneralContractor" , "Owner" , 1, "ProjectManagement" , 1, "ContractsManager" ,
7, 2, 2));
JobList.Add(new Job("DesignContractor" , "Owner" , 1, "DesignManagement" , 2,
"DesignContractsManager", 7, 2, 2));
JobList.Add(new Job("ArchitecturalPractice" , "DesignContractor" , 2, "BuildingDesign" , 1,
"LeadArchitect" , 7, 2, 2));
JobList.Add(new Job("StructuralEngineeringPractice", "DesignContractor" , 2, "StructuralDesign" , 2,
"StructuralEngineer" , 7, 2, 2));
JobList.Add(new Job("Carpentry" , "GeneralContractor", 2, "Drywalling" , 3, "Carpenter" , 5, 2, 2));
JobList.Add(new Job("PlasteringAndPainting" , "GeneralContractor", 2, "Plastering" , 4, "Plasterer" ,
6, 2, 2));
JobList.Add(new Job("PlasteringAndPainting" , "GeneralContractor", 2, "Painting" , 5, "Painter" , 8,
2, 2));
到目前为止,我的查询看起来像这样(尽管显然不起作用):
int jobStepNodeCountForJob = JobList.Where(j => j.LevelNumber == 1).Where(j => j.JobNumberOnLevel ==
2).Select(;
任何帮助,将不胜感激
解决方案
例如,返回StepCount
LevelNumber 为 1 且 JobNumberOnLevel 为 2 的所有 Job:
IEnumerable<int> jobStepCounts = JobList
.Where(j => j.LevelNumber == 1 && j => j.JobNumberOnLevel == 2)
.Select(j => j.StepCount);
因为有不止一个潜在的匹配,你会得到一组物品;你不能在一个 int 中存储多个
如果你想要多个属性,你可以投影一个新的匿名类型集合,例如:
var jobStepCountAndJobNames = JobList
.Where(j => j.LevelNumber == 1 && j => j.JobNumberOnLevel == 2)
.Select(j => new { j.StepCount, j.JobName });
对它进行 var 比尝试为这些匿名事物声明一个确切的类型更容易。
要返回符合条件的第一个作业 StepCount:
int jobStepCount = JobList
.FirstOrDefault(j => j.LevelNumber == 1 && j => j.JobNumberOnLevel == 2).StepCount;
请注意,如果没有匹配的作业,这可能会崩溃;它将返回一个空值,然后在访问时因空引用异常而崩溃。您可以执行以下操作:
int? jobStepCount = JobList
.FirstOrDefault(j => j.LevelNumber == 1 && j => j.JobNumberOnLevel == 2)?.StepCount;
如果没有作业匹配,则之前的?.
步数将不会尝试访问返回的 null 上的步数。它会立即返回 null 并且可为空的int?
将没有任何值
如果您不想要单个结果,而是想要所有步数的平均值、总和或其他聚合,请查看以下内容:
int jobStepCountAverage = JobList
.Where(j => j.LevelNumber == 1 && j => j.JobNumberOnLevel == 2)
.Average(j => j.StepCount);
推荐阅读
- nginx - 代理重启后nginx 30秒502错误超时
- javascript - 按住鼠标按钮时继续调整元素大小
- powershell - 带有标准输出的powershell中的Wget
- python - git push 失败,找不到文件 /tmp/build/static
- python - Py 脚本如何仅在首次运行时调用“设置/配置”功能?
- css - 无法在 Selenium 中使用 CSS 选择器选择同级
- jquery - 为什么这些可拖动元素有时在捕捉时会留下空间?(jQuery 用户界面)
- c++ - 对于所有编译器,C++ 中的 If 语句中的各种条件是否总是有相同的执行顺序?
- javascript - 编辑css对象的动画速度
- sql - 未找到最后日期时的 MS Access 查询日期范围