दो मौजूदा दृष्टिकोण यह देखने के लिए हैं कि ऑब्जेक्ट IEnumerable<T>
लागू करता है या सेट में पहले आइटम के प्रकार की जांच करने के लिए। पहला वास्तव में IEnumerable<T>
को लागू करने वाले ऑब्जेक्ट पर निर्भर करता है, और दूसरा केवल तभी काम करता है जब अनुक्रम में सभी आइटम समान व्युत्पन्न प्रकार के होते हैं।
एक दिलचस्प सवाल जो आप पूछ सकते हैं वह है कि सभी वस्तुओं में आम प्रकार क्या हैं, या सभी वस्तुओं के बीच सबसे संकीर्ण प्रकार क्या है।
हम एक साधारण सहायक विधि के साथ शुरू करेंगे। एक प्रकार को देखते हुए यह उस प्रकार का अनुक्रम और उसके सभी मूल प्रकारों को वापस कर देगा।
public static IEnumerable<Type> getBaseTypes(Type type)
{
yield return type;
Type baseType = type.BaseType;
while (baseType != null)
{
yield return baseType;
baseType = baseType.BaseType;
}
}
अगला हम पहले, सबसे व्युत्पन्न प्रकार के सभी खोजने तो क्रम में प्रत्येक प्रकार के लिए आधार प्रकार के सभी हो रही द्वारा एक दृश्य के लिए आम प्रकार के सभी प्राप्त करने के लिए एक विधि है, और अंत में intersect
का उपयोग कर केवल उन वस्तुओं वे सभी आम में है पाने के लिए:
public static IEnumerable<Type> getCommonTypes(IEnumerable source)
{
HashSet<Type> types = new HashSet<Type>();
foreach (object item in source)
{
types.Add(item.GetType());
}
return types.Select(t => getBaseTypes(t))
.Aggregate((a, b) => a.Intersect(b));
}
ध्यान दें कि पहली विधि में प्रकार के आदेश देने की सबसे कम से कम प्राप्त होने वाले ली गई है से, और Intersect
आदेश रखता है, ताकि परिणामस्वरूप अनुक्रम हो जाएगा सबसे व्युत्पन्न से कम से कम व्युत्पन्न से क्रम में। यदि आप इन सभी प्रकारों के लिए सबसे संकीर्ण प्रकार सामान्य खोजना चाहते हैं तो आप इस विधि के परिणामस्वरूप First
का उपयोग कर सकते हैं। (ध्यान दें कि जब सब कुछ object
से निकला है वहाँ हमेशा हो जाएगा कम से कम एक प्रकार यहाँ लौटे जब तक कि वहाँ मूल IEnumerable
में कोई आइटम नहीं हैं
@Arran, कि जेनेरिक वर्जन –
@Arran को दर्शाता है:। जरूरी नहीं है, अगर वहाँ है पहलू में कोई महत्व है कि ओपी 'Nullable' की एक सरणी दिखाता है, लेकिन 'int' को पुनर्प्राप्त करना चाहता है। –
आह सच है, मुझे अनदेखा करें :) – Arran