2013-12-17 67 views
-2

我需要使用數組中的字符串過濾列表。下面的代碼不會返回預期的結果。使用數組項目過濾列表

List<searchModel> obj=//datasource is assigned from database 

mystring="city1,city2"; 
string[] subs = mystring.Split(','); 
foreach (string item in subs) 
{ 
    obj = obj.Where(o => o.property.city.ToLower().Contains(item)).ToList(); 
} 
+0

是否有您的'searchModel'類中的屬性名爲'property'?請發佈searchModel類的代碼。 –

+0

你想要做什麼? –

+2

預期結果是什麼,目前的結果是什麼? –

回答

3

至於你使用Contains,我說你可以試圖讓

  1. 項,其中citymystring
  2. 條目的任何城市相匹配,這city從0匹配所有城市

所以,有(我簡化searchModel類,已經省略property):

List<searchModel> obj = new List<searchModel> 
{ 
    new searchModel{city = "city1"}, 
    new searchModel{city = "city2"}, 
    new searchModel{city = "city3"} 
}; 

var mystring = "city1,city2"; 
var subs = mystring.Split(',').ToList(); //let it be also List<T> 

我們可以這樣做:

//the 1st option 
var orFilter = obj.Where(o => subs.Any(s => o.city.ToLower().Contains(s))) 
        .ToList(); 
//the 2nd option 
var andFilter = obj.Where(o => subs.TrueForAll(s => o.city.ToLower().Contains(s))) 
        .ToList(); 

然後做一個簡單的檢查

foreach (var o in andFilter) 
{ 
    Console.WriteLine(o.city); 
} 

我會說OP是平等的al到選項2,而不是選項1.

+0

感謝您的回答! – chamara

1

我想你想這個,或者說接近 - 我沒有測試它:

List<searchModel> obj=//datasource is assigned from database 

mystring="city1,city2"; 

string[] subs = mystring.Split(','); 

obj = obj.Where(o => subs.Contains(o.property.city.ToLower())).ToList(); 
1

您目前所做的是按ALL城市篩選名單。因此,您只會返回o.property.city等於「city1」「city2」(以及列表中可能包含的任何其他城市)的結果。所以你不會得到任何結果。

要在列表中匹配任何一個城市相反,試試這個:

var myFilteredObj = obj.Where(o => subs.Contains(o.property.city.ToLower()).ToList(); 
0

我行添加的這個代碼,可能會幫助別人,也許有人會優化它:

var jaggedArray = new string[100][]; 
var i = 0; 
jaggedArray[i] = {"first folder","first file","first 5 files","last 5 folder"}; 
filter = "irs le"; 
var arrFilters = filter.Split(' '); 
foreach (var arrFilter in arrFilters) 
{ 
    jaggedArray[i] = jaggedArray[i].Where(p =>p.ToLower().Contains(arrFilter.ToLower())).ToArray(); 
    jaggedArray[i + 1] = jaggedArray[i]; 
    i++; 
} 
return jaggedArray[i]; //new array after filter 
//result: "first file","first 5 files"