正如标题所述,我正在寻找创建并能够与布尔条件交互的方法。
我尝试过谓词,但它们不起作用。public static Predicate<(decimal?,decimal?)> Create(Predicate<(decimal?,decimal?)> predicate) => predicate;
这仅用作我执行Condition.Create(c => c.IsSomeCalc(list1, list2))
时的过滤器
那么用例就var res=Condition(SomeValList)
创建条件有很多重载,而不仅仅是 1。
我正在尝试做的是创建一个条件,如果满足条件,则返回 true 或 false
即Condition IsLower= Condition.Create(c=>c.IsLower(decimal,decimal)
然后使用
IsLower(5,10)//=true
编辑: 假设我有一个具有字段ConditionOperator
的Condition
类 和ConditionOperator
是一个实现类的接口 像IsGreaterThan
和IsGreaterThan
我有字段IsTrue
,它是boolean
的,在该类中,我可以有多个重载来更新IsTrue
即public IsGreaterThan(decimal itm, decimal itm2) { isTrue = itm > itm2; }
然后用例将是另一个使用条件的类,例如
Test Test= new Test();
Test.Condition.ConditionOperator= new IsGreaterThanCondition(1,2);
Console.WriteLine($"{Test.Condition.ConditionOperator.IsTrue}";
这都是多余的,并且不如我尝试执行的扩展方法通用。
检查功能。
public static void Main()
{
List<double> listA = new List<double>() { 1, 2, 3 };
List<double> listB = new List<double>() { 2, 3, 4 };
// Simple example, checking if the sum of the numbers in list A
// is greater than the sum of the numbers in list B.
bool result = Check(listA, listB, (a, b) => a.Sum() > b.Sum());
Console.WriteLine($"Test result: {result}");
}
public static bool Check<T>(List<T> listA, List<T> listB, Func<List<T>, List<T>, bool> condition)
{
return condition(listA, listB);
}
如果您有两个列表,并且需要比较两个列表中的元素,则通过什么算法从两个列表中创建元素对?
如果您只想通过它们在列表中的位置将它们配对,您可以将它们.Zip()
在一起,然后应用您的条件:
var listOne = new[] { 1, 2, 3 };
var listTwo = new[] { 3, 2, 1 };
var pairs = listOne.Zip(listTwo, (a, b) => (a,b));
var aIsHigherOrEqualToB = pairs.Where(pair => pair.a >= pair.B);
var anyElementMatches = aIsHigherOrEqualToB.Any();
如果您的配对是由于某些属性匹配(例如 Id)而完成的,则可以.Join()
它们:
var listOne = new[] { ... };
var listTwo = new[] { ... };
var pairs = listOne.Join(listTwo, item => item.Id, item => item.Id, (a, b) => (a,b));
var aIsHigherOrEqualToB = pairs.Where(pair => pair.a.Value >= pair.b.Value);
var anyElementMatches = aIsHigherOrEqualToB.Any();
根据您的要求,您可以创建一个帮助程序方法,该方法根据需要封装逻辑:
public static bool AnyMatches<T>(
IEnumerable<T> a,
IEnumerable<T> b,
Func<T, T, bool> predicate)
{
var pairs = a.Zip(b, (aItem, bItem) => (aItem, bItem));
var matches = pairs.Where(pair => predicate(pair.aItem, pair.bItem));
return matches.Any();
}
public static bool AnyMatches<TItem, TKey>(
IEnumerable<TItem> a,
IEnumerable<TItem> b,
Func<TItem, TKey> selector,
Func<TKey, TKey, bool> predicate)
{
var pairs = a.Join(b, selector, selector, (aItem, bItem) => (aItem, bItem);
var matches = pairs.Where(pair => predicate(pair.aItem, pair.bItem));
return matches.Any();
}
请注意,这只是一个粗略的草图。您可能应该添加一些参数检查和其他内容以避免异常等。