2014-02-13 88 views
1

我有一個HtmlElementCollection,我想使用LINQ獲得HTML元素,其ID中包含從另一個列表中的ID列表清單上HTML元素的列表。過濾基於局部IDS

所以我試了幾件事情沒有一個解決。我從集合中獲取一個列表並嘗試對其進行過濾。

這是部分ID的列表。元素ID是不同的,並且它們具有與該列表相對應的ID以及開始時的一些隨機數字。

string[] ids = {"btadminh_struct.description", 
"thtmlb_textView_6", 
"thtmlb_textView_7", 
"btadminh_struct.object_id", 
"thtmlb_textView_12", 
"zbtsalesset_struct.po_number_sold", 
"thtmlb_textView_17", 
"thtmlb_textView_21", 
"thtmlb_textView_24", 
"btcustomerh_z_followupdate", 
"thtmlb_textView_29", 
"btrefobjmain_ibibase", 
"btrefobjmain_ibinstancedesc", 
"btpartnerserviceto_struct.description_name", 
"btpartnerset_contact_name", 
"zzericempresp_struct.partner_no", 
"zbtcsrowner_struct.partner_no", 
"btcustomerh_struct.zcomments", 
"thtmlb_textView_19", 
"btadminh_servicecontractdescr", 
"btcustomerh_zcontracttype_descr", 
"btrefobjmain_network_id", 
"btrefobjmain_node_id", 
"btrefobjmain_site_id"}; 

元素ID是這樣的:

"C29_W87_V88_btrefobjmain_network_instance", 
"C29_W87_V88_btrefobjmain_network_id__items", 
"C29_W87_V88_btrefobjmain_network_id", 
"C29_W87_V88_btrefobjmain_network_id-btn", 
"C29_W87_V88_btrefobjmain_network_id__key", 
"C29_W87_V88_thtmlb_label_2", 
"C29_W87_V88_btrefobjmain_service_id__items", 
"C29_W87_V88_btrefobjmain_service_id", 
"C29_W87_V88_btrefobjmain_service_id-btn", 
"C29_W87_V88_btrefobjmain_service_id__key", 
"C29_W87_V88_thtmlb_label_3", 
"C29_W87_V88_btrefobjmain_networkadap_id__items", 
"C29_W87_V88_btrefobjmain_networkadap_id", 
"C29_W87_V88_btrefobjmain_networkadap_id-btn", 
"C29_W87_V88_btrefobjmain_networkadap_id__key", 

所以我把我收集到,我可以查詢列表。

var elems = doc.All.Cast<HtmlElement>(); 

我已經嘗試了不同的方法,其中沒有一個是非常有效的。我也想使用Linq並避免醜陋的2-D foreach循環。

任何想法?

回答

2

所以像elems.Where(x => ids.Any(id => x.ID.Contains(id)))

這是什麼東西做的是通過每個項目要在elems的(你的HTML元素列表),然後通過每個ID在你的標識集合,如果任何比賽下去,那麼它將返回該元素。

+0

謝謝,它工作完美。解析網絡元素,以避免一個NullReferenceException的目的,我加了一個條件,使我的完整說法是: VAR elems的= doc.All.Cast ()。凡(X => ids.Any(ID =>(X。 Id!= null)&&(x.Id.Contains(id))))。ToList(); –

+1

您可以通過先前移動空檢查(大列表)來提高性能......'doc.All.Case ().Where(x => x.Id!= null).Where(x => id .Any(id => x.Id.Contains(id)))'。或者只是將空檢查移到「Any」呼叫之前,這也會起作用 –

+0

我之前做過這個,但認爲這會因爲兩次調用而變得更糟。但我想先縮小名單會是理想的嗎? –