2015-05-04 115 views
1

我將WPF應用程序與搜索文本框和Listview綁定到ICollectionView。我可以基於texbox值過濾ICollectionView,但是我有興趣通過傳遞多個由逗號分隔的值並將多個Filtering應用於集合來擴展功能。根據多個條件篩選CollectionView

var filterStrings= TextBoxValue.Split(','); 

MyCollectionView.Filter = m => 
    (((MyObject)m).myProperty.ToLower().ContainsAll(filterStrings) 

其中ContainsAll是擴展

public static bool ContainsAll(this string source, params string[] values) 
{ 
     return values.All(x => source.Contains(x)); 
} 

的過濾器不包含多個結果,任何想法,爲什麼?謝謝

編輯

,收藏的簡單的字符串值(鮑勃斌,灰色,翅,奇,殼牌),我想例如提供一個過濾器(B,F)和具有上述值(鮑勃斌,散熱片,奇)

+2

您能否介紹一個示例場景(列表中的項目是什麼,您的過濾標準和預期結果是什麼)?現在很難理解這個問題。作爲第一個猜測,我會說你應該使用'Any'而不是'All'。 –

+0

@MM:sry我沒有看到你的答案*(避免回答評論中的問題) – sac1

+0

@MártonMolnár是完全正確的,它的工作正常。我不能接受它,因爲它不是一個答案:( – Jim

回答

2

在這種情況下.All的結果意味着:它包含B和F太(和條件)

但你需要.Any (或條件)

public static bool ContainsAll(this string source, params string[] values) 
{ 
    return values.Any(x => source.Contains(x)); 
} 
1

我不知道它是最佳的,但它的工作原理:

string[] collection = new string[] {"Bob", "Bin", "Grey", "Fin", "Fantastic", "Shell" }; 
string filter = "B,F"; // TextBoxValue 
string[] filterStrings = filter.Split(','); 
string results = string.Join(",", collection.Where(c => filterStrings.Any(f => c.Contains(f)))); 

你可以把它調整到您的需要。