- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我查询远程服务一次接收一批 100 件产品,并继续这样做,直到没有更多的批处理剩余。我将这 100 个产品重新映射到我自己的产品对象,我希望一次验证一个产品对象并将其保存到数据库中。如果有人不验证我记录错误并继续其余的。处理完前 100 个后,我去获取下一批 100 个。总共大约有 5000 个。
在分析我的网站后,我看到的问题是 Validator.TryValidateObject 的运行时间似乎呈指数级增长。第一批 1000 个用了 10 分钟,第二个 1000 个用了 20 分钟,第三个 1000 个用了 30 分钟。所以好像每次都要多花 10 分钟。
Product 类有一个伙伴类 ProductValidation,带有用于验证的适当数据注释。我调用 product.IsValid()。
public class Product{
public bool IsValid()
{
return this.IsValid<Product, ProductValidation>();
}
}
使用以下代码:
public static bool IsValid<T, U>(this T obj)
{
if (typeof(T) != typeof(U))
{
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
}
var validationContext = new ValidationContext(obj, null, null);
var validationResults = new List<ValidationResult>();
//The line below slows everything down. If commented out all is fine
Validator.TryValidateObject(obj, validationContext, validationResults, true);
if (validationResults.Count > 0)
return false;
else
return true;
}
为什么上述情况会呈指数级下降?这就像验证器每次都在重新验证所有对象。
最佳答案
您描述的是二次运行时间,其中每单位工作的成本随完成的工作量线性增加。
我能看到的最可能的解释是 AddProviderTransparent
扩展具有线性搜索时间的列表,因为它使用线性搜索,或者因为存在散列冲突和通过存储桶的线性搜索。
如果您为每个工作单元添加一个新提供者,并为每个单元处理整个提供者列表,那么您将获得二次运行时间。
不是在每次调用时都扩展提供者列表,而是仅当所需的提供者不在列表中时才这样做。你可以使用 HashSet<Pair<Type, Type>>
记住什么T, U
您已经添加的对。
关于c# - 为什么 Validator.TryValidateObject 的速度呈指数级下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26090528/
我使用 WebApi v2 构建了一些将对象作为参数的东西。我将 IValidateableObject 和 dataannotations 用于我使用 WebApi 过滤器触发的模型验证。 但是,一
我正在尝试获得一个非常简单的控制台应用程序,以便在我的对象上使用本地化和 TryValidateObject。 我有一个学生类: public class Student {
我正在使用 Validator.TryValidateObject() 来验证使用数据注释的对象。当对象无效时,代码执行正常。但是,如果有效,则会产生 stackoverflow 错误。 这是我的方法
我正在编写一个简单的模型验证器来检查从配置文件中读取的数据,我正在使用 System.ComponentModel.DataAnnotations 当我打电话 bool isValid = Valid
namespace ClassValidation { public class Student { [Required(ErrorMessage = "Name is
我查询远程服务一次接收一批 100 件产品,并继续这样做,直到没有更多的批处理剩余。我将这 100 个产品重新映射到我自己的产品对象,我希望一次验证一个产品对象并将其保存到数据库中。如果有人不验证我记
我有一个简单的问题(或没有)。 为什么当我验证我的对象时,下面的代码每次验证一个部分。 如果 DataAnnotations 失败,则不会调用 IValidatableObject 的验证。如果 Da
问题:除了使用 Validator.TryValidateObject 之外,还有其他验证 DataAnnotations 的方法吗? 原因:无法指定验证器是否要验证 IValidatableObje
我创建了一个针对类的自定义 ValidationAttribute。每当我尝试调用 Validator.TryValidateObject 时,这都会正确验证。但是当我的类中的属性中有其他 Valid
这是方法定义: public static bool TryValidateObject( Object instance, ValidationContext validationContext,
给定以下对象, public class Question { [Required] public string QuestionText { get; set; } [Ran
DataAnnotations 不适用于好友类。以下代码始终验证 true。为什么? var isValid = Validator.TryValidateObject(new Customer(),
我是一名优秀的程序员,十分优秀!