2012-05-08 14 views
6

में जेनेरिक सूची का उपयोग कर कैसे RemoveAll लिए अगर मैं इस तरह सामान्य सूची का उपयोग करें: जब powershell

$foo = New-Object 'system.collections.generic.list[object]' 
$foo.Add((New-Object PSObject -Property @{ Name="Foo1"; })) 
$foo.Add((New-Object PSObject -Property @{ Name="Foo2"; })) 
$foo.Add((New-Object PSObject -Property @{ Name="foo3"; })) 

मैं कैसे आवेदन कर सकता RemoveAll() List<T> की विधि? भविष्यवाणी का उपयोग करना संभव है? उदाहरण के लिए मैं पूंजी 'एफ' से शुरू होने वाली सभी वस्तुओं को कैसे हटा सकता हूं?

उत्तर

10

मुझे लगता है कि एकमात्र तरीका System.Predicate का उपयोग किए बिना है जो प्रतिनिधियों की आवश्यकता है (क्षमा करें, लेकिन वास्तव में मैं यह नहीं समझ सकता कि शक्तिशक्ति में अज्ञात प्रतिनिधि कैसे बनाते हैं) और कहां ऑब्जेक्ट क्लॉज का उपयोग करें।

मेरे उदाहरण में मैं परिणाम $foo वैरिएबल को फिर से असाइन करता हूं जिसे list<T> पर फिर से डालने की आवश्यकता होती है।

त्रुटि से बचने के अगर परिणाम गिनती केवल एक ही यह ',' हमेशा एक array मान बनाने के लिए

[system.collections.generic.list[object]]$foo = , ($foo | ? {$_.name -cnotmatch "^f" }) 

संपादित की जरूरत है:

कुछ परीक्षण के बाद मैंने पाया कि कैसे उपयोग लैम्ब्डा अभिव्यक्ति का उपयोग कर powershell scriptblock:

$foo.removeAll({ param($m) $m.name.startswith('F', $false , $null) }) 

इस विधि कि जरूरतप्रयोग करने के लिए सही तरीका है powershell

+0

नरक जो बदसूरत दिखता है। खैर अगर यह काम करता है कौन परवाह करता है, है ना? धन्यवाद! – Agzam

+0

आपकी मदद करने में प्रसन्नता! –

+0

मुझे लगता है कि कोई पावरहेल के भीतर डीएलआर का आह्वान कर सकता है और एक अनाम विधि बना सकता है जिसे लैम्ब्डा के रूप में पारित किया जा सकता है। मैं निश्चित रूप से लिखने की कोशिश नहीं कर रहा हूं, खुद, हालांकि :)। – Shibumi

3

में ०६२१०८३२१० यहाँ scriptblocks (अनाम प्रतिनिधियों) का उपयोग कर एक और विकल्प है:

$foo.RemoveAll({$args[0].Name -clike 'F*'}) 
0

यह पता चला मैं वास्तव में चाहता था .clear() विधि बल्कि RemoveAll से। RemoveAll केवल तभी जरूरी है जब आप सूची में सभी वस्तुओं की बजाय वस्तुओं का समूह निकालना चाहते हैं।