使用.NET Core C#对List<T>中的主要特性进行数据验证

6

我已通过从不同格式(例如CSV、Parquet、Avro、JSON)读取数据的方式,将数据作为List<T>提取出来。

我希望能够使用大多数特征对数据进行验证。例如:温度应在95%的时间范围内保持不变,其余时间列值可以为null或超出范围。

样例用例期望:

Expect_Column_Values_To_Be_Between(
    columnName = "temprature",
    minValue   =  60,
    maxValue   =  75,
    mostly     = .95
)

数据标注似乎在一定程度上解决了这个问题(主要缺少的特性),因为它是在行级别而不是整个表即对象级别上工作。
[Range(60, 75, ErrorMessage = "Thermostat value {0} must be between {1} and {2}.")]
public int Temprature;

Python软件包参考:https://github.com/great-expectations/.great_expectations包含类似的数据级别验证。
现在试图寻找指导如何验证数据(无论是通过任何现有等效的.NET库还是通过创建新的帮助程序类/扩展方法)。

查看此链接 https://github.com/FluentValidation/FluentValidation - Cinchoo
是的,我研究了一下。发现它适用于行级验证。但为了拥有大多数功能,我们需要在表级别(即整个对象上)进行验证。 - user3542245
根据我的理解,我打算创建一个帮助库,其中包含扩展方法来执行验证:public static bool Expect_Column_Values_To_Be_Between<T>(this List<T> items, string columnName, double minValue, double maxValue, double mostly) { //验证逻辑 return true; } - user3542245
辅助库将是最佳解决方案。我尝试使用流畅验证框架编写响应来回答您的问题,但在C#中实现所需的代码量开始超出“快速简单的自定义类”的范围。 - HaroldMorgan
1个回答

1
创建了一个示例扩展方法,可以在表格即对象级别上验证数据。
public class Room
{
    public int RoomId { get; set; }
    public string Name { get; set; }
    public double Temprature { get; set; }
}

List<Room> rooms = new List<Room>();
rooms.Add(new Room() { RoomId = 1, Name = "Hall", Temprature = 65 });
rooms.Add(new Room() { RoomId = 2, Name = "Kitchen", Temprature = 75 });

bool result = rooms.Expect_Column_Values_To_Be_Between("Temprature", 60, 75, .95);

public static class ValidationExtensions
{
    public static bool Expect_Column_Values_To_Be_Between<T>(this List<T> items,
                    string columnName, double minValue, double maxValue, double mostly = 1)
    {
        if (mostly < 0 || mostly > 1)
            throw new ArgumentOutOfRangeException(
                       $"Mostly value {{{mostly}}} can not be less 0 or greater than 1");
        else if (mostly == 0)
            return true;

        if (items == null || items.Count == 0)
            return false;


        int itemsInRangeCount = 0;

        foreach (var item in items)
        {
            PropertyInfo? propertyInfo = item.GetType().GetProperty(columnName);
            if (propertyInfo == null)
                throw new InvalidDataException($"Column not found : {columnName}");

            var itemValue = Convert.ToDouble(propertyInfo.GetValue(item));

            if (itemValue >= minValue && itemValue <= maxValue)
                itemsInRangeCount++;
        }

        return (itemsInRangeCount / items.Count) >= mostly ? true : false;
    }   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接