2013-12-13 328 views
1

我有這樣的方法動態的LINQ包含過濾列表

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr) 
{ 
    var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string)); 

    var filter = propsToCheck.Aggregate(string.Empty, (s, p) => (s == string.Empty ? string.Empty : string.Format("{0} OR ", s)) + string.Format("{0} == @0", p.Name).ToLower()); 

    var filtered = source.AsQueryable().Where(filter, searchStr); 
    return filtered; 
} 

這需要列表和搜索字符串,然後在列表中找到任何匹配。然而,這隻適用於100%的匹配,我如何使這種情況下不敏感,並使用包含而不是100%的匹配?

+0

因此,基本上你只需要過濾那些包含給定字符串的字符串? – pvgoran

+0

不,讓我說我通過一個物品清單,一個屬性是國家,有價值澳大利亞和奧地利。所以當我用搜索字符串發送方法時,「Aus」返回列表中的兩個國家的列表。它是在列表內搜索,遍歷所有字段並返回任何屬性包含給定字符串的對象。此外,我需要它不區分大小寫 – w2olves

+0

它應該適用於任何類型的對象? (順便說一下,你不能在泛型函數中使用typeof(T),或者你的問題的代碼實際上是這樣工作的?) – pvgoran

回答

3

構建一個動態的LINQ查詢在這裏看起來不是最好的選擇。與代表篩選將做得更好:

public static IEnumerable<T> Filter<T>(IEnumerable<T> source, string searchStr) 
{ 
    var searchStrLower = searchStr.ToLower(); 
    var propsToCheck = typeof(T).GetProperties().Where(a => a.PropertyType == typeof(string) && a.CanRead); 

    return source.Where(obj => { 
    foreach (PropertyInfo prop in propsToCheck) 
    { 
     string value = (string)prop.GetValue(obj); 
     if (value != null && value.ToLower().Contains(searchStrLower)) return true; 
    } 
    return false; 
    }); 
} 
+0

很好,謝謝你,先生,我欠你一個。說真的,我已經在這個問題上拖了一個星期了一個星期了。謝謝 – w2olves