【问题标题】:filter on comma separated string within list过滤列表中的逗号分隔字符串
【发布时间】:2014-06-04 09:54:29
【问题描述】:

我有一个列表,其中包含一个逗号分隔的字符串值,其中包含标签。

我想根据这个逗号分隔字符串中的值过滤列表。

列表中的逗号分隔字符串通常如下所示:

list.Tags = "Tag 1, Tag2, Another Tag"

我尝试了以下方法,但收到未设置为实例的对象引用错误。 NextDate 只是一个返回列表中适当项目的子句,现在需要找到匹配的“标签”。我只会搜索 1 个标签。

list = list.Where(x => x.NextDate >= todaysDate).Where(x => x.Tags.Contains("Tag 1")).ToList();

有什么想法可以为某个标签过滤我的列表吗?

[重复的问题没有回答我的问题,我正在尝试获取正确的语法来过滤我的列表,但该问题无济于事。我的问题与 Linq 语法有关]

【问题讨论】:

  • 这个 Linq 将在内存中执行还是针对数据库执行?如果你在内存中工作,你可以简单地使用 list.Tags.Split(',')
  • 如果标签是“标签 10”,您的方法将不起作用,因此按照 Moeri 提到的方式拆分它。

标签: c# linq


【解决方案1】:

添加空检查:

list = 
  list.Where(
    x => null != x.NextDate && 
    x.NextDate >= todaysDate && 
    null != x.Tags && 
    x.Tags.Contains("Tag 1"))
  .ToList();

如果你想确保你匹配的正是标签(即你有标签 1 和标签 11):

list = 
  list.Where(
    x => null != x.NextDate && 
    x.NextDate >= todaysDate && 
    null != x.Tags && 
    x.Tags.Split.Contains("Tag 1"))
  .ToList();

【讨论】:

  • ppittle,第二个代码块缺少 Split() 上的方法括号。它似乎也无法正常工作?它似乎没有退回一些我希望退回的物品。第一个代码块确实有效,但正如您提到的,它没有返回完全匹配。
  • Split方法需要加上分隔符,所以应该是.Split(',')。这样就解决了。
  • 不需要null != x.NextDate 部分。如果NextDate 是一个不可为空的结构,那永远不会发生。在其他情况下,>= 运算符应该处理左操作数为null 的情况,因此无需担心。
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多