我有一个课程如下:
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包含字符串中的所有关键字。
答案 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)));
答案 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();