Ir al contenido principal

Métodos de Colecciones

ValiFlow<T> ofrece un conjunto completo de métodos para validar y filtrar propiedades de tipo colección. Cubre verificaciones de vacuidad, pertenencia a conjuntos, restricciones de conteo, proyecciones con predicados y unicidad.

Ejemplos: ValiFlow · Evaluators


Vacuidad

NotEmpty<TValue>

Pasa cuando la colección no es null y no está vacía.

var rule = new ValiFlow<Product>()
.NotEmpty<string>(x => x.Tags);

Empty<TValue>

Pasa cuando la colección es null o está vacía.

var rule = new ValiFlow<Order>()
.Empty<string>(x => x.Errors);

Pertenencia

In

Pasa cuando el valor escalar seleccionado está presente en la lista proporcionada.

var rule = new ValiFlow<Order>()
.In(x => x.Status, ["Active", "Pending"]);

NotIn

Pasa cuando el valor escalar seleccionado no está presente en la lista proporcionada.

var rule = new ValiFlow<User>()
.NotIn(x => x.Status, ["Banned", "Deleted"]);

Contains<TValue>

Pasa cuando la colección contiene un valor específico.

var rule = new ValiFlow<Product>()
.Contains<string>(x => x.Tags, "csharp");

Conteo

Count<TValue>

Pasa cuando la colección tiene exactamente N elementos.

var rule = new ValiFlow<Order>()
.Count<OrderLine>(x => x.Items, 5);

CountEquals<TValue>

Alias de Count<TValue> con intención semántica más clara.

var rule = new ValiFlow<Order>()
.CountEquals<OrderLine>(x => x.Items, 5);

CountBetween<TValue>

Pasa cuando el número de elementos cae dentro del rango [min, max] (inclusive).

var rule = new ValiFlow<Product>()
.CountBetween<string>(x => x.Tags, 1, 10);

MinCount<TValue>

Pasa cuando la colección tiene al menos N elementos. Una colección null falla.

var rule = new ValiFlow<Order>()
.MinCount<OrderLine>(x => x.Items, 1);

MaxCount<TValue>

Pasa cuando la colección tiene como máximo N elementos. Una colección null falla.

var rule = new ValiFlow<Order>()
.MaxCount<OrderLine>(x => x.Items, 100);

Predicados

Any<TValue>

Pasa cuando al menos un elemento de la colección satisface el predicado.

var rule = new ValiFlow<Order>()
.Any<OrderLine>(x => x.Items, item => item.Price > 0);

All<TValue>

Pasa cuando todos los elementos de la colección satisfacen el predicado.

var rule = new ValiFlow<Order>()
.All<OrderLine>(x => x.Items, item => item.IsActive);

None<TValue>

Pasa cuando ningún elemento satisface el predicado. Una colección null pasa vacuamente.

var rule = new ValiFlow<Product>()
.None<string>(x => x.Tags, t => t == "banned");

AllMatch<TValue> — patrón composable

Acepta un ValiFlow<TValue> pre-construido y pasa cuando todos los elementos lo satisfacen. Ideal para reutilizar reglas de validación internas.

// Regla interna reutilizable
var lineItemRule = new ValiFlow<OrderLine>()
.GreaterThan(x => x.Quantity, 0)
.Positive(x => x.UnitPrice);

// Componer en la regla exterior
var orderRule = new ValiFlow<Order>()
.NotEmpty<OrderLine>(x => x.Lines)
.AllMatch(x => x.Lines, lineItemRule); // reutilizar el filtro pre-construido

EachItem<TValue>

Variante inline de AllMatch — construye la regla interna con una lambda.

var rule = new ValiFlow<Order>()
.EachItem<OrderLine>(x => x.Items, item =>
item.MinLength(x => x.ProductCode, 3));

AnyItem<TValue>

Variante inline de Any — pasa cuando al menos un elemento satisface la regla construida inline.

var rule = new ValiFlow<Order>()
.AnyItem<OrderLine>(x => x.Items, item =>
item.GreaterThan(x => x.Price, 0));

Unicidad

HasDuplicates<TValue>

Pasa cuando la colección contiene elementos duplicados.

var rule = new ValiFlow<Order>()
.HasDuplicates<string>(x => x.Codes);

DistinctCount<TValue>

Pasa cuando la colección tiene exactamente N elementos distintos.

var rule = new ValiFlow<Product>()
.DistinctCount<string>(x => x.Tags, 3);

Patrón Composable — Ejemplo Completo

// Regla interna: cada línea de pedido debe ser válida
var lineItemRule = new ValiFlow<OrderLine>()
.GreaterThan(x => x.Quantity, 0)
.Positive(x => x.UnitPrice)
.NotEmpty<string>(x => x.ProductCode);

// Regla exterior: el pedido en sí
var orderRule = new ValiFlow<Order>()
.NotNull(x => x.CustomerId)
.NotEmpty<OrderLine>(x => x.Lines)
.MinCount<OrderLine>(x => x.Lines, 1)
.MaxCount<OrderLine>(x => x.Lines, 100)
.AllMatch(x => x.Lines, lineItemRule);

// Uso en memoria
bool isValid = orderRule.IsValid(order);

// Uso con IQueryable (ValiFlowQuery para EF Core)
Expression<Func<Order, bool>> expr = orderRule.Build();
var results = await dbContext.Orders.Where(expr).ToListAsync();

Mini ejemplos

1) Forzar unicidad

var regla = new ValiFlow<Order>()
.HasDuplicates<string>(o => o.Tags)
.NotNull(o => o.CustomerId);

2) Ventana de conteo

var regla = new ValiFlow<Cart>()
.MinCount<CartItem>(c => c.Items, 1)
.MaxCount<CartItem>(c => c.Items, 50);