1

我正在尝试编写一些逻辑来确定集合中对象的某个属性的所有值是否都是数字并且大于零。我可以使用 ForEach 轻松编写此代码,但我想使用 Linq to Object 编写此代码。我试过这个:

var result = entity.Reports.Any(
    x =>
    x.QuestionBlock == _question.QuestionBlock
    && (!string.IsNullOrEmpty(x.Data)) && Int32.TryParse(x.Data, out tempVal) 
    && Int32.Parse(x.Data) > 0);

它不能正常工作。我也试过这个,希望 Int32 上的 TryParse() 在第一次遇到无法解析为 int 的字符串时返回 false。但似乎 out 参数将包含可以解析为 int 的第一个值字符串值。

var result = entity.GranteeReportDataModels.Any(
    x =>
    x.QuestionBlock == _question.QuestionBlock
    && (!string.IsNullOrEmpty(x.Data)) && Int32.TryParse(x.Data, out tempVal));

任何帮助是极大的赞赏!

4

3 回答 3

3

如果要测试“所有”值是否满足条件,则应使用All扩展方法 off IEnumerable<T>,而不是Any. 我会这样写:

var result = entity.Reports.All(x =>
{
  int result = 0;
  return int.TryParse(x.Data, out result) && result > 0;
});

我认为您不需要测试空字符串或空字符串,因为int.TryPrase如果您传入空字符串或空字符串,则会返回 false。

于 2013-05-03T15:11:05.610 回答
1
 var allDataIsNatural = entity.Reports.All(r =>
     {
         int i;
         if (!int.TryParse(r.Data, out i))
         {
             return false;
         }

         return i > 0;
     });

Any当第一行是true但是时会返回,你清楚地说你想检查它们

于 2013-05-03T15:07:01.973 回答
0

您可以使用此扩展程序尝试将字符串解析为int并返回int?

public static int? TryGetInt(this string item)
{
    int i;
    bool success = int.TryParse(item, out i);
    return success ? (int?)i : (int?)null;
}

然后这个查询有效:

bool all = entity.Reports.All(x => { 
    if(x.QuestionBlock != _question.QuestionBlockint) 
        return false;
    int? data = x.Data.TryGetInt(); 
    return data.HasValue && data.Value > 0; 
});

或更具可读性(效率稍低):

bool all = entityReports
    .All(x => x.Data.TryGetInt().HasValue && x.Data.TryGetInt() > 0 
           && x.QuestionBlock == _question.QuestionBlockint);

这种方法避免使用局部变量作为out参数,这是 Linq-To-Objects 中未记录的行为,将来可能会停止工作。它也更具可读性。

于 2013-05-03T15:01:54.553 回答