查找所有关键词

时间:2015-10-16 16:06:12

标签: c# linq

我有一个课程如下:

public class PropertyResult {
  public Int32 Id { get; set; }
  public String Keywords { get; set; }
}

我有一个这个类的列表和一个字符串:

List<PropertyResult> properties = externalAPI.GetProperties();

List<String> keywords = new List<String> { "A", "B", "C" }

请注意,属性关键字类似于&#34; A,B,C&#34;。

我需要获取所有包含ALL关键字的属性。我当时要去:

properties = listing.Properties.All(x => keywords.Contains(x.Keywords))

问题是x.Keywords包含字符串中的所有关键字。

4 个答案:

答案 0 :(得分:2)

请尝试以下操作。

List<PropertyResult> properties = new List<PropertyResult>();

List<String> keywords = new List<String> { "A", "B", "C" };

properties.Add(new PropertyResult() { Id = 1, Keywords = "A,B,C" });
properties.Add(new PropertyResult() { Id = 1, Keywords = "A,B,C,D" });
properties.Add(new PropertyResult() { Id = 1, Keywords = "B,C,D" });

var result = properties.Where(p => p.Keywords.Split(',').Except(keywords).Count() == 0);

当我在LINQPad中运行上面的result时,IEnumerable<PropertyResult>只有一个条目,PropertyResult包含“A,B,C”(正如您所期望的那样)

如果你不是LINQPad的粉丝,这里是一个.NET小提琴(https://dotnetfiddle.net/wKAJfb)。

答案 1 :(得分:2)

您可以使用Where + All: -

var result = properties.Where(x => keywords.All(z => x.Keywords.Contains(z)));

Fiddle.

答案 2 :(得分:0)

您必须拆分关键字字符串,以便拥有各个关键字,然后将该收藏集与您拥有的关键字进行比较。我假设你不关心订单 - 一个带有关键字&#34; B,A,C&#34;将匹配&#34; A,B,C&#34;。

的关键字列表
var keywords = new List<string>{"a","b","c"};
var matches = listing.Properties.Where(
         prop => new HashSet<string>(prop.Keywords.Split(','))
                 .SetEquals(keywords));

我们在这里做的是按字符串拆分关键字并将它们加载到HashSet中,HashSet是集合操作的有效数据结构。然后我们使用SetEquals方法检查hashset是否包含与关键字列表相同的元素。

答案 3 :(得分:-1)

如果其中一个关键字与属性匹配,您希望使用.Any遍历字符串数组并返回True

properties = listing.Properties.Where(x => keywords.Any(a => a[0] == x)).ToList();