我只有一个对象(数据库中的一条记录),并希望判断该对象是否匹配以Func<T, bool>为形式的给定条件.

我通过将对象添加到对象列表中来解决这个问题,并try 使用where子句从这个列表中获取它,给定如下条件

var testMatch = new Test
{
    t1 = "123"
};

// Query is stored in a string and compiled with Sprint.Filter.OData to p => p.t1 == "123"
var query = "t1 eq '123'";
var compiledQuery = Filter.Deserialize<Test>(query).Compile();

// This works like expected
Console.WriteLine(Match<Test>(compiledQuery, testMatch));

public bool Match<T>(Func<T, bool> condition, T testObject)
{
    var test = new List<T>();
    test.Add(testObject);
    var t = test.Where(condition).FirstOrDefault();
    return (t != null);
}

public class Test
{
    public string t1 {get; set;}
}

因此,这符合预期,但我想知道是否有比创建列表、将其添加到此列表并try 使用条件检索它更简单的方法来测试单个对象.

我是不是错过了什么很简单的东西?

推荐答案

从字面上看,Func<T, bool>表示接受T并返回bool的函数.在本例中,它是一个返回T是否满足条件的函数,即exactly what you wanted.

你可以直接叫它:

bool satisfiesCondition = compiledQuery(testMatch);

你不需要把它给Where.你认为Where是如何实现的?Where也像这样调用你提供的Func<T, bool>,以确定对象是否应该在它返回的IEnumerable<T>中.

Csharp相关问答推荐

有没有方法让ASP.NET Core模型绑定器使用私有设置器来设置属性?

IComponition.获取IReadOnlyCollection的返回默认属性值

如何修改中间件或其注册以正确使用作用域服务?

在FilePath中搜索一个词,并根据First Match从左到右提取文件路径

Blazor Foreach仅渲染最后一种 colored颜色

Int和uint相乘得到LONG?

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

只有第一个LINQ.Count()语句有效

如何使datagridview的列具有响应性,以便不是所有列都更改其宽度

Appsettings.json未加载.Net 8 Blaazor Web程序集

Selify只更改第一个下拉菜单,然后忽略REST-C#

在C#中过滤Excel文件

C#动态设置ServerReport报表参数

System.NotSupportdException:流不支持读取

Blazor:搜索框在第一次搜索时不搜索

C#无法将.csv列转换为用于JSON转换的列表

将两个for循环更改为一条LINQ语句

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

在Visual Studio 2022中查找Xamarin模板时遇到问题

同时通过多个IEumable<;T&>枚举