2014-02-13 5 views
1

У меня есть HtmlElementCollection, и я хочу использовать Linq для получения списка HtmlElements, идентификаторы которого содержат идентификатор из другого списка.Фильтрация списка HtmlElements на основе списка частичных идентификаторов

Итак, я пробовал пару вещей, которые не были разработаны. Я получаю список из коллекции и пытаюсь ее фильтровать.

Это список частичных идентификаторов. Идентификаторы элементов различны, и они имеют идентификаторы, соответствующие этому списку плюс некоторые случайные числа в начале.

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"}; 

идентификаторы элементы выглядят следующим образом:

"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 и избегать уродливого двухмерного цикла foreach.

Любые идеи?

ответ

2

так что-то вроде elems.Where(x => ids.Any(id => x.ID.Contains(id)))

Что это делает происходит через каждый пункт в elems (ваш HTML элемент списка), а затем проходит через каждый идентификатор в вашей коллекции ид, и если какой-либо матч, то он возвращает этот элемент ,

+0

Спасибо, он работал отлично. Для того, чтобы анализировать веб-элементы, чтобы исключить исключение NullReferenceException, я добавил условие, поэтому мой полный оператор: var elems = doc.All.Cast () .Where (x => ids.Any (id => (x. Id! = Null) && (x.Id.Contains (id)))). ToList(); –

+1

Вы можете улучшить производительность, перемещая нулевую проверку раньше (в больших списках) ... 'doc.All.Case () .Where (x => x.Id! = Null). Где (x => ids .Any (id => x.Id.Contains (id))). Или просто переместите нулевую проверку перед вызовом 'Any', и это тоже будет работать –

+0

Я сделал это раньше, но думал, что будет хуже из-за вызова где дважды. Но, судя по всему, сужение списка было бы идеальным? –

Смежные вопросы