Use Lambda/LINQ to efficiently filter sets containing multiple keywords
Question:
How to efficiently use Lambda expressions or LINQ to filter a collection based on multiple keywords?
Solution:
The example given in the question highlights the need to check for multiple keywords in one field (here the "Comments" field). While there are examples of filtering based on a single keyword, extending this logic to multiple keywords requires a more powerful approach.
Lambda expression method:
We can use the extension method provided in the answer to achieve this requirement using Lambda expressions:
<code class="language-csharp">var newList = MainList .FilterByItems(keywords, (m, k) => m.Comments.Contains(k), true) .ToList();</code>
LINQ method:
Alternatively, we can use LINQ to achieve the same result:
<code class="language-csharp">var newList = MainList.Where(m => keywords.Any(k => m.Comments.Contains(k)));</code>
Explanation:
Both methods use the FilterByItems extension method in the QueryableExtensions class. This method accepts a collection of items, a predicate to apply, and a Boolean value indicating whether to perform an "OR" or "AND" operation.
In our example, we pass the list of keywords as items, a predicate that checks if the Comments field contains each keyword, and sets isOr to true to perform an "OR" operation. This ensures that if a record contains any of the specified keywords, it is included in the results.
Implementation of FilterByItems extension method:
FilterByItems method is implemented using ExpressionReplacer class, which allows us to replace part of the expression. This is used to generate a predicate that checks for the presence of each keyword.
Example usage:
To use the FilterByItems method, we simply provide the collection to filter, a list of keywords to check, and optionally set isOr to true for an "OR" operation, or to false for an "AND" operation.
<code class="language-csharp">// 过滤“Comments”字段中的关键词 var filteredList = MainList.FilterByItems(keywords, (m, k) => m.Comments.Contains(k)); // 使用OR操作包含任何匹配关键词的记录 var newList = MainList.FilterByItems(keywords, (m, k) => m.Comments.Contains(k), true);</code>
The above is the detailed content of How to Efficiently Filter a Collection Based on Multiple Keywords with Lambda/LINQ?. For more information, please follow other related articles on the PHP Chinese website!