嗨我有一個名稱類型對象的集合,我想對其執行通配符搜索。例如,如果我提供搜索標準*ABC
,則返回的名稱應以ABC
開頭。如果我提供搜索標準ABC*
,則返回的名稱應以ABC
結尾。如果我提供搜索標準*ABC*
,則返回的名稱應包含ABC
。如果我提供搜索標準?ABC
,則返回名稱的第二個,第三個和第四個字符應分別爲ABC
,第一個字符可以是任何字符。使用WildCards字符(如*,%,?)進行LINQ搜索
回答
這裏是您可以使用
public static class EnumerableExtensions
{
public static IEnumerable<T> MatchesWildcard<T>(this IEnumerable<T> sequence, Func<T,string> expression, string pattern)
{
var regEx = WildcardToRegex(pattern);
return sequence.Where(item => Regex.IsMatch(expression(item), regEx));
}
public static string WildcardToRegex(string pattern)
{
return "^" + Regex.Escape(pattern).
Replace("\\*", ".*").
Replace("\\?", ".") + "$";
}
}
如下使用它的擴展方法:
void Main()
{
var items = new[] { new MyObj { MyProperty = "ABC123" },
new MyObj { MyProperty = "123ABC" },
new MyObj { MyProperty = "123ABC456" },
};
var matches = items.MatchesWildcard(item => item.MyProperty, "???ABC");
}
public class MyObj
{
public string MyProperty {get;set;}
}
(從CodeProject採取WildcardToRegex)
您的正則表達式方法(您從我的頭頂複製並鍵入)比我的好。 – ErikHeemskerk 2010-06-23 14:22:19
@ErikHeemskerk - 爲什麼要學習RegEx語法,當你有谷歌? :-) – 2010-06-23 14:30:28
我認爲你需要使用。載,.StartWith,.EndsWith
我想你需要Regex.Escape和Regex.IsMatch()。
private IEnumerable<Item> FilterList(IEnumerable<Item> list, string query)
{
string pattern = QueryToRegex(query);
return list.Where(i => Regex.IsMatch(i.Name, pattern, RegexOptions.Singleline));
}
private static string QueryToRegex(string query)
{
return "^" + Regex.Escape(query).Replace("\\*", ".*").Replace("\\?", ".") + "$";
}
注:Samuel Jack's answer在他的正則表達式是更好的更好,所以在這裏可恥固定它。
擊敗我38秒,+1! – 2010-06-23 14:18:50
啊,但無論如何這一切都是徒勞的,因爲塞繆爾傑克發佈了一個更好的方法來將通配符表達式轉換爲正則表達式;我的工作不正常。 – ErikHeemskerk 2010-06-23 14:23:23
這article列表擴展方法也兼容與實體框架和LINQ到實體。
用法示例:
var searchTerm = "*Inc";
var q = db.Customers
.WhereLike(c => c.CompanyName, searchTerm, '*')
.ToList();
的源代碼:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
public static class LinqExtensions
{
public static IQueryable<TSource> WhereLike<TSource>(
this IQueryable<TSource> source,
Expression<Func<TSource, string>> valueSelector,
string value,
char wildcard)
{
return source.Where(BuildLikeExpression(valueSelector, value, wildcard));
}
public static Expression<Func<TElement, bool>> BuildLikeExpression<TElement>(
Expression<Func<TElement, string>> valueSelector,
string value,
char wildcard)
{
if (valueSelector == null)
throw new ArgumentNullException("valueSelector");
var method = GetLikeMethod(value, wildcard);
value = value.Trim(wildcard);
var body = Expression.Call(valueSelector.Body, method, Expression.Constant(value));
var parameter = valueSelector.Parameters.Single();
return Expression.Lambda<Func<TElement, bool>>(body, parameter);
}
private static MethodInfo GetLikeMethod(string value, char wildcard)
{
var methodName = "Contains";
var textLength = value.Length;
value = value.TrimEnd(wildcard);
if (textLength > value.Length)
{
methodName = "StartsWith";
textLength = value.Length;
}
value = value.TrimStart(wildcard);
if (textLength > value.Length)
{
methodName = (methodName == "StartsWith") ? "Contains" : "EndsWith";
textLength = value.Length;
}
var stringType = typeof(string);
return stringType.GetMethod(methodName, new Type[] { stringType });
}
}
- 1. 使用OQL進行字符串搜索
- 2. 使用ASCII字符和進行二進制搜索字符串?
- 3. 使用Linq和Trim.Text進行搜索
- 4. LINQ-to-SQL:使用CSV進行搜索
- 5. 如何在LINQ中進行STAR搜索
- 6. 如何使用上一個ID字符進行搜索?
- 7. 如何在elasticsearch中使用Unicode字符進行搜索?
- 8. 使用sql進行關鍵字搜索
- 9. 如何使用LINQ在數據表中進行搜索?
- 10. 搜索如果使用LINQ
- 11. 如何用文字進行搜索「+ - =」 .etc
- 12. 使用linq搜索
- 13. 使用LINQ搜索
- 14. 使用grep進行搜索
- 15. 使用EntityFramework進行搜索
- 16. 使用NSOperation進行搜索
- 17. 使用xsl進行搜索
- 18. 使用LINQ進行全文搜索,使用每個關鍵字減少結果
- 19. Solr/SolrNet - 使用通配符進行逐字母搜索
- 20. 無法在WKWebView上使用「&」字符進行谷歌搜索
- 21. 使用搜索字符串對列表進行排序
- 22. LINQ - 如何使用NHibernate進行多條件的部分搜索.LINQ
- 23. 如何使用attr_accessor進行搜索?
- 24. 如何使用PDO進行LIKE搜索?
- 25. 如何使用EF CodeFirst進行搜索
- 26. 如何使用Google API進行搜索?
- 27. 使用查詢linq搜索空字段
- 28. 使用linq-to-sql幫助進行高級數據庫搜索
- 29. 使用LINQ進行遞歸控制搜索
- 30. 使用sqlite進行搜索索引?
我們談論LINQ到對象這裏,或LINQ到SQL? – 2010-06-23 13:57:17
@Samuel:看起來像LINQ-to-Objects,因爲他提到他有'收集對象'。 – ErikHeemskerk 2010-06-23 14:16:56