【问题标题】:C# - Filter a list of objects by text for each object propertyC# - 按每个对象属性的文本过滤对象列表
【发布时间】:2013-06-01 14:14:31
【问题描述】:

我有一个从实体框架模型创建的对象列表,如下所示:

List<Model.Log> logs = db.Log.ToList();

我目前正在为此列表实现一些过滤器,这些过滤器显示在 MVC 视图上。

我要做的只是通过用户输入的文本过滤此列表的结果,但是我发现的示例演示了过滤字符串或整数,而不是对象的多个属性。

我愿意使用不同的集合类型,只要有一种相对简单的方法可以通过对象属性的文本过滤集合。

非常感谢所有帮助!

【问题讨论】:

  • 这不是一项简单的任务。想象一下在 Google 中解析文本和搜索内容需要什么。尽管您的实现更加有限,但您需要解析字符串,然后将其插入到 LINQ 中存在的功能中。
  • 您可以使用反射来获取任意对象的所有属性,然后按照乔治约翰斯顿的方法检查它们是否包含字符串。
  • @keyCrumbs 您可以使用 LINQ,但并非必须如此。如果您愿意,可以使用 LINQ 重写上面的示例代码。另请注意,如果您的“日志”具有一个也是集合的属性,则不应仅对其执行 ToString,而应忽略或使用相同的技术进行更深入的解析。
  • @keyCrumbs 还注意到这种技术的性能可能很糟糕,这取决于许多方面,还有内存使用情况......所以如果我试图过滤具有已知属性的对象,我会把它放在那里一定要像乔治一样进行查询,无需反思。
  • @keyCrumbs 如果我理解正确,您可以执行类似 db.Log.Where(q=>q.Property1.Contains(text)||q.Property2.Contains(text)|| Property3.Contains(text)) 将返回匹配任一属性的结果,因为我们将 em 与 OR 运算符组合在一起。

标签: c# search collections filter


【解决方案1】:

一个非常简单和非常基本的实现是使用.Contains 扩展,例如

var r = db.Log.Where(q=>q.YourLogProperty.Contains(userEnteredText)).ToList();

...YourLogProperty 是您正在搜索的实际文本/字符串,userEnteredText 是来自您的用户的文本。

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 1970-01-01
    • 2019-06-08
    • 2021-08-10
    • 2015-03-20
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多