refactoring - LINQ select item from a list where string contains any of the search terms in a list -> refactor -


i have list of items, called translations. filter translations based on search term search box, looks this:

private static ilist<translation> filtertranslationlistold(string filter, ienumerable<translation> translationlist) {     filter = filter.tolower();     if (!string.isnullorempty(filter))     {          return translationlist             .where(t => (t.tag.filename.tolower().contains(filter)                             || t.tag.filepath.tolower().contains(filter)                             || t.tag.tagcontent.tolower().contains(filter)                             || (t.tag.sanitizedtagcontent != null && t.tag.sanitizedtagcontent.tolower().contains(filter))                             || (t.tagtranslation != null && t.tagtranslation.tolower().contains(filter))                             || (t.sanitizedtranslation != null && t.sanitizedtranslation.tolower().contains(filter))))             .orderby(t => t.tag.filepath)             .thenby(t => t.tag.filename).thenby(t => t.tag.id).tolist();     }     return translationlist.orderbydescending(t => t.datetranslated).tolist(); } 

i've introduced ability search multiple keywords, so:

private static ilist<translation> filtertranslationlist(string filter, ienumerable<translation> translationlist)         {             filter = filter.tolower();             var splitfilterterms = filter.split(',');              if (splitfilterterms.any(split=>!string.isnullorempty(split)))             {                 var translationlistresults = new list<translation>();                 foreach (var splitfilterterm in splitfilterterms)                 {                    translationlistresults.addrange(translationlist                    .where(t => (t.tag.filename.tolower().contains(splitfilterterm)                                    || t.tag.filepath.tolower().contains(splitfilterterm)                                    || t.tag.tagcontent.tolower().contains(splitfilterterm)                                    || (t.tag.sanitizedtagcontent != null && t.tag.sanitizedtagcontent.tolower().contains(splitfilterterm))                                    || (t.tagtranslation != null && t.tagtranslation.tolower().contains(splitfilterterm))                                    || (t.sanitizedtranslation != null && t.sanitizedtranslation.tolower().contains(splitfilterterm))))                    .orderby(t => t.tag.filepath)                    .thenby(t => t.tag.filename).thenby(t => t.tag.id).tolist());                 }                 return translationlistresults;             }             return translationlist.orderbydescending(t => t.datetranslated).tolist();         } 

what know is, there nicer way of writing this? whilst works, nice know how in linq or reduce/refactor little (make little neater). in advance!

try looking @ selectmany, flatten sequence of sequences:

private static ilist<translation> filtertranslationlistold(string filter, ienumerable<translation> translationlist) {     filter = filter.tolower();     var splitfilterterms = filter.split(',');     if (splitfilterterms.any(split=>!string.isnullorempty(split)))      {         return splitfilterterms.selectmany(f => translationlist             .where(t => (t.tag.filename.tolower().contains(f)                             || t.tag.filepath.tolower().contains(f)                             || t.tag.tagcontent.tolower().contains(f)                             || (t.tag.sanitizedtagcontent != null && t.tag.sanitizedtagcontent.tolower().contains(f))                             || (t.tagtranslation != null && t.tagtranslation.tolower().contains(f))                             || (t.sanitizedtranslation != null && t.sanitizedtranslation.tolower().contains(f))))             .orderby(t => t.tag.filepath)             .thenby(t => t.tag.filename).thenby(t => t.tag.id)).tolist();     }     return translationlist.orderbydescending(t => t.datetranslated).tolist(); } 

i haven't run code. here msdn documentation of selectmany.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -