有没有办法创建一个布尔函数,该函数接受两个 List 对象并在满足条件时返回 true 或 false?



正如标题所述,我正在寻找创建并能够与布尔条件交互的方法。

我尝试过谓词,但它们不起作用。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

编辑: 假设我有一个具有字段ConditionOperatorCondition类 和ConditionOperator是一个实现类的接口 像IsGreaterThanIsGreaterThan我有字段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();
}

请注意,这只是一个粗略的草图。您可能应该添加一些参数检查和其他内容以避免异常等。

最新更新