2012-04-13 19 views
10

मेरे पास विंडोज़ फॉर्म यूआई पर एक वृक्षदृश्य नियंत्रण है और इसमें कुछ नोड्स हैं (एकाधिक बाल नोड्स के साथ)। मैं नोड्स संग्रह से पूछताछ करना चाहता हूं, कहें, 1. उन लोगों का चयन करें जिनके नाम 'x'
से शुरू होते हैं 2. उन लोगों का चयन करें जिनके पास नोड में कोई डेटा नहीं है। फ़ील्ड फ़ील्ड।प्रश्न एक वृक्ष नोडकोलेक्शन

क्या कोई मुझे ऐसा करने का तरीका सुझा सकता है। लिंक इसे आसान और साफ कर देगा, लेकिन मुझे TreeNodeCollection से पूछने के लिए लिंक पर कुछ भी नहीं मिला।

धन्यवाद,

+1

साथ कुछ इस तरह की कोशिश कर सकते आपके वृक्षदृश्य नोड्स की गहराई क्या है? अगर बच्चे नोड्स के पास नोड्स हैं तो आपको एक रिक्त क्वेरी की आवश्यकता है। –

+0

अभी के लिए, मैं कह सकता हूं कि गहराई सिर्फ 1. – ViV

+1

यह लिंक मदद कर सकता है .... [1]: http://stackoverflow.com/questions/1815497/enumerating-collections-that-are-not- निहित रूप से-ienumerable/1815600 # 1815600 –

उत्तर

32

TreeNodeCollection क्योंकि पूर्व दिनांकों .NET 2.0, है ना एक सामान्य संग्रह है, इसलिए यह IEnumerable<T>, जो LINQ अच्छाई के लिए 'मास्टर' प्रकार है को लागू नहीं करता है।

हालांकि, अगर आप सिर्फ एक TreeNodeCollection पर .Cast<TreeNode>() कॉल कर सकते हैं, और आप एक IEnumerable<TreeNode>, जो आप तो सभी LINQy अच्छाई के लिए कर सकते हो।

(इस दृष्टिकोण किसी भी तरह के संग्रह को लागू करने वाली के लिए काम करता IEnumerable नहीं बल्कि IEnumerable<T>)

+0

धन्यवाद। ऐसा लगता है जैसे करेंगे। लेकिन मुझे एक और बुनियादी समस्या है। मैंने निम्न कोशिश की: 'आईनेमेरेबल बाल नोड्स = treeView2.Nodes.Cast (); var x = childNodes.Where (node ​​=> node.Tag == null); ' यह वास्तव में काम नहीं करता है क्योंकि बाल नोड्स में वास्तव में 'सभी' बच्चे नोड्स नहीं होते हैं। असल में, मैं ऐसा करने की कोशिश कर रहा हूं: मेरे पास एन नोड्स के साथ एक वृक्षदृश्य है और प्रत्येक नोड में वाई बच्चे नोड्स हैं। मैं इस पूरे पेड़ को कुछ मानदंडों पर फ़िल्टर करना चाहता हूं। मैं इसकी शुरुआत कैसे करूं। क्या आप सुझाव दे सकते हैं .. – ViV

+2

यदि आप पूरे पेड़ को खोजना चाहते हैं, तो एक पुनरावर्ती विधि प्राकृतिक पसंद प्रतीत होती है। यह शायद पहले एसओ पर आया है - एक त्वरित खोज ने मुझे [यह] पाया (http://stackoverflow.com/questions/177277/how-to-get-a-list-of-all-child-nodes-in- ए-ट्रीव्यू-इन-नेट) जो वीबी.नेट में है लेकिन आसानी से अनुवाद योग्य होना चाहिए; बहुत कुछ होगा। – AakashM

2

मैं हर माता-पिता के तहत नेस्टेड नोड्स संग्रह की वजह से हाल ही में कुछ इसी तरह की कोशिश की और LINQ दृष्टिकोण के साथ संघर्ष किया है।

मैंने अपनी समस्या को एक रिकर्सिव फ़ंक्शन के साथ हल किया जो सभी नोड्स की खोज करता था। उचित रूप से सुरुचिपूर्ण।

वीबी:

Private Function FindNode(name As String, root As TreeNode) As TreeNode 
    For Each n As TreeNode In root.Nodes 
     If n.Name = name Then 
      'Found, get out 
      Return n 

     Else 
      'Recursively call FindNode to search this node's children 
      Dim soughtNode = FindNode(name, n) 
      If soughtNode IsNot Nothing Then 
       Return soughtNode 
      End If 
     End If 
    Next 

    Return Nothing 

End Function 
+0

क्या आप इस विचार को पीछे साझा कर सकते हैं। – ViV

3

आप एक Fixpoint ऑपरेटर की इजाजत दी पुनरावर्ती lambdas

// Fix point operator 
public static Func<T, T> Fix<T>(Func<Func<T, T>, Func<T, T>> f) 
{ 
    return t => f(Fix<T>(f))(t); 
} 
तो

// your treeView 
var tv = new TreeView(); 

// Your filter Func 
Func<TreeNode, bool> filterStartWithXorNoData = 
    node => node.Text.StartsWith("x") || string.IsNullOrEmpty(node.Text); 

// Your recursive lambda 
var filteredNodes = Fix<IEnumerable<TreeNode>>(
    f => 
    nodeList => 
    nodeList.SelectMany(node => f(node.ChildNodes.Cast<TreeNode>())) 
     .Union(nodeList.Where(filterStartWithXorNoData))) 
     (tv.Nodes.Cast<TreeNode>()); 
संबंधित मुद्दे