我有一个列表,其中包含(除其他外)备注1,备注2和备注3。我想确保在这些字段中只写有效的注释。今天我这样检查它:
foreach (GradeRow row in Grade.GradeRows)
{
if (!(okRemarks.Contains(row.Remark1) && okRemarks.Contains(row.Remark2) && okRemarks.Contains(row.Remark3)))
{
FailedCourseCodes.Add(row.CourseCode);
}
}
有没有一个 Linq 表达式可以做类似的事情.包含(列表)?
您仍然需要单独检查每个字段,但可以消除循环:
FailedCourseCodes.Add(
Grade.GradeRows.Where(row=>
okRemarks.Contains(row.Remark1) &&
okRemarks.Contains(row.Remark2) &&
okRemarks.Contains(row.Remark3)
)
);
您可以通过从字段创建一个数组来使其稍短:
FailedCourseCodes.Add(
Grade.GradeRows.Where(row=>
(new [] {row.Remark1, row.Remark2, row.Remark3})
.Except(okRemarks).Any()
)
);
但在我看来,这显然更难阅读。
像这样的东西将返回所有包含错误注释的行:
Grade.GradeRows.Where( row => new string[]{row.Remark1, row.Remark2, Row.Remark3}.Any ( remark => !okRemarks.Any(remark)))
.相交( IEnumerable ) 然后比较结果的 Count() 是我能想到的唯一选择。以下几行
:foreach( var failedGrade in Grade.GradeRows
.Select( x => new String[]{ row.Remark1, row.Remark2, row.Remark3 } )
.Where( remarks => remarks.Intersect( okRemarks ).Count() < remarks.Length ) )
{
FailedCourseCodes.Add(failedGrade.CourseCode);
}
@d-Stanley做对了,但没有正确添加结果
foreach( var failedGrade in Grade.GradeRows.Where( row => !(
okRemarks.Contains(row.Remark1) &&
okRemarks.Contains(row.Remark2) &&
okRemarks.Contains(row.Remark3) ) ) )
{
FailedCourseCodes.Add(failedGrade.CourseCode);
}