以编程方式检查值是否与 C# 中的预定义规则匹配
Programatically check if values match predefined rules in c#
我使用条件 class 存储了一个规则列表,如下所述。我的目标是根据实际值检查这些规则。
例如
public class Condition
{
public string Field {get;set;}
public string Operation {get;set;}
public string Value {get;set;}
}
例如
new Condition("order_status", "is", "confirmed")
我如何检查订单实例的 属性 状态是否真的符合提供的条件?
public class Order
{
public string Status {get;set;}
}
我很乐意向您提供我尝试过的方法,但我真的不知道如何开始这个。
public class OrderConditionComparator
{
public void Compare(Order order, Condition condition)
{
...
}
}
我很确定这不是最优雅的方式,但您可以使用 List<Func<Order, bool>>
作为您的规则集,将规则添加到列表中,并为每个订单循环规则集并测试它是否通过所有规则。这是一个示例:
public static void Main(string[] args) {
var orders = new List<Order>();
var ruleset1 = new List<Func<Order, bool>>();
var ruleset2 = new List<Func<Order, bool>>();
AddRules(ruleset1);
AddRules2(ruleset2);
AddOrders(orders);
foreach (var order in orders) {
bool passed = true;
foreach (var rule in ruleset1) {
if (!(rule.Invoke(order))) {
passed = false;
Console.WriteLine("Order with Id " + order.Id + " did not pass ruleset 1");
break;
}
}
if (passed) Console.WriteLine("Order with Id " + order.Id + " passed ruleset 1");
passed = true;
foreach (var rule in ruleset2) {
if (!(rule.Invoke(order))) {
passed = false;
Console.WriteLine("Order with Id " + order.Id + " did not pass ruleset 2");
break;
}
}
if (passed) Console.WriteLine("Order with Id " + order.Id + " passed ruleset 2");
}
}
// Just a few orders for testing
private static void AddOrders(List<Order> orders) {
orders.Add(new Order() { Id = 0, ClientName = "Joe", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 1, ClientName = "Mary", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 2, ClientName = "June", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 3, ClientName = "Joe", Status = Order.OrderStatus.Unconfirmed });
orders.Add(new Order() { Id = 4, ClientName = "Lisa", Status = Order.OrderStatus.Unconfirmed });
}
// Rules in ruleset 1 checks if the user is called Joe and the order status is Confirmed
private static void AddRules(List<Func<Order, bool>> ruleset1) {
ruleset1.Add((order) => {
return order.ClientName == "Joe";
});
ruleset1.Add((order) => {
return order.Status == Order.OrderStatus.Confirmed;
});
}
// Rules in ruleset 2 checks if the order status is Confirmed
private static void AddRules2(List<Func<Order, bool>> ruleset2) {
ruleset2.Add((order) => {
return order.Status == Order.OrderStatus.Confirmed;
});
}
public class Order {
public int Id { get; set; }
public string ClientName { get; set; }
public OrderStatus Status { get; set; }
public enum OrderStatus { Confirmed, Unconfirmed }
}
除此之外,您还可以使用 LINQ,如 @itsme86 所建议:
public static void Main(string[] args) {
var orders = new List<Order>();
AddOrders(orders);
var confirmed = orders.Where(s => s.Status == Order.OrderStatus.Confirmed);
foreach (var order in confirmed) {
Console.WriteLine("Order with Id " + order.Id + " is confirmed");
}
}
// Just a few orders for testing
private static void AddOrders(List<Order> orders) {
orders.Add(new Order() { Id = 0, ClientName = "Joe", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 1, ClientName = "Mary", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 2, ClientName = "June", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 3, ClientName = "Joe", Status = Order.OrderStatus.Unconfirmed });
orders.Add(new Order() { Id = 4, ClientName = "Lisa", Status = Order.OrderStatus.Unconfirmed });
}
public class Order {
public int Id { get; set; }
public string ClientName { get; set; }
public OrderStatus Status { get; set; }
public enum OrderStatus { Confirmed, Unconfirmed }
}
我使用条件 class 存储了一个规则列表,如下所述。我的目标是根据实际值检查这些规则。
例如
public class Condition
{
public string Field {get;set;}
public string Operation {get;set;}
public string Value {get;set;}
}
例如
new Condition("order_status", "is", "confirmed")
我如何检查订单实例的 属性 状态是否真的符合提供的条件?
public class Order
{
public string Status {get;set;}
}
我很乐意向您提供我尝试过的方法,但我真的不知道如何开始这个。
public class OrderConditionComparator
{
public void Compare(Order order, Condition condition)
{
...
}
}
我很确定这不是最优雅的方式,但您可以使用 List<Func<Order, bool>>
作为您的规则集,将规则添加到列表中,并为每个订单循环规则集并测试它是否通过所有规则。这是一个示例:
public static void Main(string[] args) {
var orders = new List<Order>();
var ruleset1 = new List<Func<Order, bool>>();
var ruleset2 = new List<Func<Order, bool>>();
AddRules(ruleset1);
AddRules2(ruleset2);
AddOrders(orders);
foreach (var order in orders) {
bool passed = true;
foreach (var rule in ruleset1) {
if (!(rule.Invoke(order))) {
passed = false;
Console.WriteLine("Order with Id " + order.Id + " did not pass ruleset 1");
break;
}
}
if (passed) Console.WriteLine("Order with Id " + order.Id + " passed ruleset 1");
passed = true;
foreach (var rule in ruleset2) {
if (!(rule.Invoke(order))) {
passed = false;
Console.WriteLine("Order with Id " + order.Id + " did not pass ruleset 2");
break;
}
}
if (passed) Console.WriteLine("Order with Id " + order.Id + " passed ruleset 2");
}
}
// Just a few orders for testing
private static void AddOrders(List<Order> orders) {
orders.Add(new Order() { Id = 0, ClientName = "Joe", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 1, ClientName = "Mary", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 2, ClientName = "June", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 3, ClientName = "Joe", Status = Order.OrderStatus.Unconfirmed });
orders.Add(new Order() { Id = 4, ClientName = "Lisa", Status = Order.OrderStatus.Unconfirmed });
}
// Rules in ruleset 1 checks if the user is called Joe and the order status is Confirmed
private static void AddRules(List<Func<Order, bool>> ruleset1) {
ruleset1.Add((order) => {
return order.ClientName == "Joe";
});
ruleset1.Add((order) => {
return order.Status == Order.OrderStatus.Confirmed;
});
}
// Rules in ruleset 2 checks if the order status is Confirmed
private static void AddRules2(List<Func<Order, bool>> ruleset2) {
ruleset2.Add((order) => {
return order.Status == Order.OrderStatus.Confirmed;
});
}
public class Order {
public int Id { get; set; }
public string ClientName { get; set; }
public OrderStatus Status { get; set; }
public enum OrderStatus { Confirmed, Unconfirmed }
}
除此之外,您还可以使用 LINQ,如 @itsme86 所建议:
public static void Main(string[] args) {
var orders = new List<Order>();
AddOrders(orders);
var confirmed = orders.Where(s => s.Status == Order.OrderStatus.Confirmed);
foreach (var order in confirmed) {
Console.WriteLine("Order with Id " + order.Id + " is confirmed");
}
}
// Just a few orders for testing
private static void AddOrders(List<Order> orders) {
orders.Add(new Order() { Id = 0, ClientName = "Joe", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 1, ClientName = "Mary", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 2, ClientName = "June", Status = Order.OrderStatus.Confirmed });
orders.Add(new Order() { Id = 3, ClientName = "Joe", Status = Order.OrderStatus.Unconfirmed });
orders.Add(new Order() { Id = 4, ClientName = "Lisa", Status = Order.OrderStatus.Unconfirmed });
}
public class Order {
public int Id { get; set; }
public string ClientName { get; set; }
public OrderStatus Status { get; set; }
public enum OrderStatus { Confirmed, Unconfirmed }
}