Obtuve los datos como Lista < T > leyendo desde diferentes formatos, por ejemplo, CSV, Parquet, Avro, JSON.
Quiero validar los datos con la mayoría de las características, por ejemplo, la temperatura debe permanecer dentro del rango el 95% del tiempo, y el resto del valor de la columna de tiempo puede ser nulo o estar fuera de rango.
Ejemplo de expectativa de caso de uso:
Expect_Column_Values_To_Be_Between( columnName = "temprature", minValue = 60, maxValue = 75, mostly = .95 )La anotación de datos parece resolverlo parcialmente ( falta la mayoría de las funciones ), ya que funciona en el nivel de fila, no en toda la tabla, es decir, en el nivel de objeto.
[Range(60, 75, ErrorMessage = "Thermostat value {0} must be between {1} and {2}.")] public int Temprature;La referencia del paquete de Python: https://github.com/great-expectations/.great_expectations contiene validaciones de nivel de datos similares.
Ahora trato de buscar orientación sobre cómo validar los datos (ya sea por cualquier biblioteca equivalente existente en .NET o mediante la creación de nuevos métodos de extensión/clase auxiliar)
Creó un método de extensión de muestra que valida los datos en la tabla, es decir, a nivel de objeto
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; } }