[C#] 搜尋 T 裡面是否有某屬性中有某關鍵字

2012-10-04

 

在進行設計的時候,使用泛型進行Library 的撰寫,其中遇到,是否可以搜尋某屬性是否帶有某關鍵字..

使用時候,必須要像是這樣:

 





static List<User> sampleUsers = new List<User>();

protected void Page_Load(object sender, EventArgs e)
{
if (sampleUsers.Count == 0)
{
for (int i = 1; i <= 1000000; i++)
{
sampleUsers.Add( new User { Name = "User" + i });
}
}

TestLib.Search<User> search = new Search<User>();

Stopwatch sw = new Stopwatch();
sw.Start();

//搜尋Name 此屬性是否帶有ER5 這字詞
var res = search.SearchListPropertyValue(sampleUsers, "Name", "ER5");

sw.Stop();
Response.Write("搜尋到筆數為 " + res.Count() + ",耗時:" + sw.Elapsed + "<br />");

}



其中的TestLib 並非同一個專案,在撰寫 SearchListPropertyValue 這Method 時根本不知道傳入物件為何..
但是卻又要抓出某一屬性內容的值..所以要用到反射..





using System;
using System.Collections.Generic;
using System.Linq;

namespace TestLib
{
public class Search<T>
{
/// <summary>
/// 搜尋是否物件某屬性中是否帶有某關鍵字
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="lists"></param>
/// <param name="propertyName">屬性名</param>
/// <param name="propertyValue">是否包含某關鍵字</param>
/// <returns></returns>
public T[] SearchListPropertyValue<T>(List<T> lists, string propertyName, string propertyValue)
{
List<T> re = new List<T>();

return
lists.Where(
x => x.GetType().GetProperty(propertyName).GetValue(x, null).ToString().IndexOf(propertyValue, StringComparison.OrdinalIgnoreCase) >= 0).
ToArray();

//foreach (var obj in lists)
//{
// if(obj.GetType().GetProperty(propertyName).GetValue(obj, null).ToString().IndexOf(propertyValue,StringComparison.OrdinalIgnoreCase)>=0)
// {
// re.Add(obj);
// }
//}

//return re.ToArray();
}
}
}



其中,我註解的部份是沒有使用LINQ的寫法,只是因為在測試速度上面是不是有差..


其實我註解掉部分就以這例子看測出來時間差不了多少..


 


因為其中我測試資料是一百萬筆資料…比對也是關鍵字的部份…


這樣經過反射,所測出來得結果為


搜尋到筆數為 111111,耗時:00:00:00.9820906


 


我另一篇文章  找尋字串中是否包含某字詞.. 也是做字串上的比對..


但是上篇文章用IndexOf 的方式平均大概在 00:00:00.35xxxxx 左右..


 


這測試數值大概給大家參考一下,畢竟這案例都算簡單,我想做的事情更複雜,時間會差距更大..


當麻許的超技八 2014 | Donma Hsu Design.