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
Post a Comment