0

我有一个包含(除其他外)Remark1、Remark2 和 Remark3 的列表。我想确保在这些字段中只写有效的备注。今天我像这样检查它:

foreach (GradeRow row in Grade.GradeRows)
{
    if (!(okRemarks.Contains(row.Remark1) && okRemarks.Contains(row.Remark2) && okRemarks.Contains(row.Remark3)))
    {
        FailedCourseCodes.Add(row.CourseCode);
    }
}

是否有可以执行 .Contains(List) 之类的 Linq 表达式?

4

3 回答 3

5

您仍然必须单独检查每个字段,但您可以消除循环:

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()
        )
);

但在我看来,这更难阅读。

于 2013-01-24T14:42:46.020 回答
1

像这样的东西将返回所有包含坏评论的行:

 Grade.GradeRows.Where( row => new string[]{row.Remark1, row.Remark2, Row.Remark3}.Any ( remark => !okRemarks.Any(remark)))
于 2013-01-24T14:43:18.450 回答
0

.Intersect( 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);
}
于 2013-01-24T15:35:10.087 回答