使用数组项过滤List

时间:2013-12-17 04:02:52

标签: c# linq

我需要使用数组中的字符串过滤列表。下面的代码不会返回预期的结果。

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();
}

5 个答案:

答案 0 :(得分:3)

就你使用Contains而言,我会说你可能会试图获得

  1. 条目,citymystring
  2. 中的任何城市相匹配
  3. 条目citymystring
  4. 中的所有城市相匹配

    所以,(我简化了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等于选项2,而不是选项1。

答案 1 :(得分: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();

答案 2 :(得分:1)

您目前正在做的是按所有城市过滤列表。因此,您只返回o.property.city等于“city1”“city2”(以及列表中可能包含的任何其他城市)的结果。所以你不会得到任何结果。

要匹配列表中的任何城市,请尝试以下操作:

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

答案 3 :(得分: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"

答案 4 :(得分:0)

var result = obj.Where(piD => subs.Contains(piD.city)).ToList();

上面的代码将根据字符串数组过滤obj List