2015-10-16 173 views
2

我有一個類如下:找到所有關鍵字

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" } 

注意,屬性的關鍵詞是類似「A, B,C「。

我需要獲取所有包含所有關鍵字的屬性。我正在爲:

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

問題是,x.Keywords在字符串中包含所有關鍵字。

+1

你可以改變'Keywords'是一個'List'而不是逗號分隔字符串? –

+0

不......這就像來自外部API那樣。我無法控制它。 –

回答

2

您可以使用Where + All: -

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

Fiddle.

+0

不幸的是,如果集合包含不同數量的字符,則這不起作用。使用我的測試(請參閱其他答案)如果「關鍵字」字符串包含「A,B,C,D」,它將返回。也許這沒關係(OP的問題對是否允許超集有點不清楚)。 –

+0

@CraigW。 - 對我來說不行OP的問題很明顯,因爲他說**我需要獲得所有包含所有關鍵字的屬性。**因此,對於後者,他的意思是'列表關鍵字'反之亦然。 –

+0

是的,我也讀過他的原文。您引用的聲明,至少在撰寫時,可以解釋。我仍然認爲不清楚是否允許精確集合匹配或超集(即集合[A,B,C]和[A,B,C,D] ==或!=)。鑑於他接受了你的回答,我期望他的目的應該被認爲是==,但是如果有人試圖在不允許超集的情況下實施你的解決方案,他們會得到不正確的結果。 –

-1

如果其中一個關鍵字與屬性匹配,則要使用.Any來檢查字符串數組並返回True

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

我很確定,甚至不會編譯。上下文變量'x'屬於'PropertyResult'類型,因此'a [0] == x'試圖將'char'與'PropertyResult'進行比較。 –

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>一次入境,包含 「A,B,C」(正如你所期望/希望)的PropertyResult

如果你不是LINQPad的粉絲,這裏有一個.NET小提琴(https://dotnetfiddle.net/wKAJfb)。

0

您必須拆分關鍵字字符串,以便您擁有各個關鍵字,然後將該集合與您擁有的集合進行比較。我假設你不關心訂單 - 具有關鍵字「B,A,C」的財產將匹配關鍵字列表「A,B,C」。

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

我們在這裏所做的是字符串分割關鍵字並將它們加載到一個HashSet,這是一組操作的高效數據結構。然後我們使用SetEquals方法來檢查哈希集是否包含與關鍵字列表相同的元素。