मान लें कि मेरे पास निम्न ऑब्जेक्ट ग्राफ़ है

Parent : BaseEntity
  string1 SimpleString
  Middle Middle
  List<Child> Children (3)

Middle : BaseEntity
  string NormalStr
  int NiceInt
  RandomClass Ignore

 Child : BaseEntity
   string ChildString
   Parent Parent
  

इस उदाहरण में मैं अपने माता-पिता को इनपुट के रूप में देने और एक फ्लैट सूची {माता-पिता, मध्य, चाइल्ड 1, चाइल्ड 2, चाइल्ड 3} वापस पाने का एक तरीका चाहता हूं। इसे किसी भी प्रकार के ऑब्जेक्ट ग्राफ़ के लिए काम करना चाहिए।

मैं प्रतिबिंब और रिकर्सन के साथ वहां पहुंचने की कोशिश कर रहा हूं। मैं जिस समस्या में भाग लेता हूं वह माता-पिता और बच्चे के बीच चक्रीय संदर्भ है और मैं अनंत लूप में समाप्त होता हूं।

मैं इसे कैसे न होने दूँ? मुझे काम करने के लिए कोई "पहले से देखा गया" तंत्र नहीं मिल रहा है।

मुझे अब तक यही मिला है। यह संग्रह भाग के बिना काम करता है, लेकिन वह हिस्सा बहुत महत्वपूर्ण है ...

    public void TraverseThroughProperties(object myObject)
    {
        foreach (var prop in myObject.GetType().GetProperties())
        {
            var instance = prop.GetValue(myObject);
            if (instance is BaseEntity myBase)
                TraverseThroughProperties(instance);


            if (instance is ICollection collection)
            {
                foreach (var item in collection.OfType<BaseEntity>())
                    TraverseThroughProperties(item);
            }

            // Do something with myObject + prop
        }
    }
2
Zuldaan 18 सितंबर 2020, 02:12

1 उत्तर

सबसे बढ़िया उत्तर

अगर मैं प्रश्न को सही ढंग से समझता हूं, तो मुझे लगता है कि आपके द्वारा देखे गए प्रकारों का HashSet सबसे आसान तरीका होगा।

public static void TraverseThroughProperties(object myObject, HashSet<Type> hashset = null)
{
   hashset ??= new HashSet<Type>();
   if (hashset.Contains(myObject.GetType()))
      return;
   hashset.Add(myObject.GetType());
   ...

नोट: यह इष्टतम नहीं हो सकता है क्योंकि यह उसी प्रकार को अस्वीकार कर देगा। दूसरा तरीका यह है कि माता-पिता के बच्चे के प्रकारों का दौरा किया जाए। हालांकि एक बार फिर यह अपेक्षा से अधिक फ़िल्टर कर सकता है।

public static void TraverseThroughProperties(object myObject, object parent, HashSet<(Type,Type)> hashset = null)
{
   hashset ??= new HashSet<(Type,Type)>();
   ...

एक और तरीका है, वास्तविक संदर्भ हैश करना। जो संदर्भों का ट्रैक रखेगा, या एक बार फिर, माता-पिता के बच्चे के संदर्भों का ट्रैक रखेगा

public static void TraverseThroughProperties(object myObject, HashSet<object> hashset = null)
{
   hashset ??= new HashSet<object>();
   if (hashset.Contains(myObject))
      return;
   hashset.Add(myObject);

हालाँकि अभी भी वह नहीं हो सकता है जिसकी आप तलाश कर रहे हैं और बहुत अधिक फ़िल्टर करें। यह तब एक वैचारिक समस्या बन जाती है, और आपको यह सोचने की आवश्यकता हो सकती है कि आप क्या कर रहे हैं और क्यों कर रहे हैं।

1
TheGeneral 17 सितंबर 2020, 23:30