2013-05-09 50 views
0

我有項目列表,稱爲翻譯。我篩選基於從一個搜索框搜索詞翻譯,目前它看起來像這樣:LINQ從列表中選擇項目,其中字符串包含列表中的任何搜索項 - >重構

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

我現在已經推出了多個關鍵詞進行搜索,像這樣的能力:

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

我想知道的是,有沒有更好的寫作方式?雖然它可以工作,但如果知道如何在所有LINQ中完成它,或者稍微減少/重構它(使它變得更簡潔),那就太好了。提前致謝!

回答

1

嘗試尋找在SelectMany,這將有助於你壓扁序列的序列:

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

我還沒有實際運行該代碼。 Here is the MSDN documentation of SelectMany

+0

正是我在找的東西。將它全部保存在linq中,並稍微整理一下。謝謝!我仍然覺得linq有時難以閱讀(要立即理解),但我不確定這是因爲缺乏熟悉還是因爲語法非常混亂。 – 2013-05-09 15:38:04

+2

如果你認爲它雜亂無章,你可以將'Where'子句的整個參數提取到'Func '類型的變量中。這可能會讓事情更加整潔。 – 2013-05-09 15:42:44

0

與上面的代碼的問題是,它顯示在OR條件,而不是AND ... 所以,如果你有這些項目:

List<Car> Cars = new List<Car>(); 
Cars.Add(new Car(){Manufacturer="Mercedes Benz", Color="Blue"}); 
Cars.Add(new Car(){Manufacturer="Mercedes Benz", Color="Green"}); 

它會同時顯示,如果過濾器是「梅賽德斯藍」

我用這個代碼,只顯示藍色車:

string Filter = "Mercedes blue"; 
List<string> SplittedFilter = new List<string>(Filter.ToLowerInvariant().Split(' ')); 

List<Car> FilteredCars = Cars; 

foreach (var item in SplittedFilter) { 
    FilteredCars = (from c in FilteredCars 
        where c.Manufacturer.ToLowerInvariant().Contains(item) || c.Color.ToLowerInvariant().Contains(item) 
        select c).ToList(); 

} 

來源:http://www.groggyjava.tv/blog/?p=84

相關問題