2013-12-17 5 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. записи, city из которых соответствует какому-либо город от mystring
  2. записей, city которых соответствуют всем городам от mystring

Таким образом, имея (я упростил 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 равно equ 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

Что вы сейчас делаете, это фильтрация списка по всем городам. Таким образом, вы вернете результаты только там, где 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" 
Смежные вопросы