0

翻訳と呼ばれるアイテムのリストがあります。検索ボックスからの検索語に基づいて翻訳をフィルタリングします。現在、次のようになっています。

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でそれを行う方法を知っているか、少し削減/リファクタリングする方法を知っておくとよいでしょう(少しきれいにします)。前もって感謝します!

4

2 に答える 2

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

私は実際にこのコードを実行していません。 SelectMany の MSDN ドキュメントは次のとおりです。

于 2013-05-09T14:21:58.533 に答える