2009-03-18 9 views
5

क्या कोई इंडेक्स प्रकार करने के लिए कोई अंतर्निहित सी # समर्थन है?क्या इंडेक्स-आधारित सॉर्ट के लिए सी # समर्थन है?

अधिक जानकारी:
मेरे पास डबल के व्यक्तिगत जेनेरिक सूचियों में संग्रहीत डेटा के कई सेट हैं। ये सूचियां हमेशा लंबाई में बराबर होती हैं, और संबंधित डेटा आइटम धारण करती हैं, लेकिन ये सूचियां आती हैं और गतिशील रूप से जाती हैं, इसलिए मैं केवल कक्षा या संरचना में संबंधित डेटा आइटम को स्टोर नहीं कर सकता। (मैं कुछ विरासत मुद्दों से भी निपट रहा हूं।)

मुझे किसी भी डेटा सेट से इन कुंजी को सॉर्ट करने में सक्षम होना चाहिए।

ऐसा करने का सबसे अच्छा तरीका मेरा विचार है कि एक स्तर का संकेत जोड़ें, और एक इंडेक्स आधारित सॉर्ट का उपयोग करें। इस तरह के वर्षों के लिए उपयोग में किया गया है।

सूचकांक के त्वरित परिभाषा तरह आधारित:
मेकअप "अनुक्रमणिका", लगातार पूर्णांकों की एक सरणी सूची के रूप में एक ही लंबाई, तो तरह एल्गोरिथ्म पूर्णांकों की सूची क्रमित करता है जिससे कि anylist[index[N]] anylist की वां आइटम देता है क्रमबद्ध क्रम में। सूचियों को कभी भी फिर से आदेश नहीं दिया जाता है।

क्या कोई इंडेक्स प्रकार करने के लिए कोई अंतर्निहित सी # समर्थन है? मैं इसे खोजने में असमर्थ रहा हूं ... जो कुछ भी मैंने पाया है वह संग्रह स्वयं ही है। मेरा अनुमान है कि समर्थन मौजूद है लेकिन मैंने अभी तक सही जगह पर नहीं देखा है।

मैं विंडोज के तहत सी # .NET 3.5 का उपयोग कर रहा हूं।

उत्तर

12

एक बार जब आप सूचकांक सरणी की स्थापना की है, आप इसे एक कस्टम Comparison<T> कि डेटा सरणी में इसी आइटम में मानों तुलना का उपयोग कर सॉर्ट कर सकते हैं:

Array.Sort<int>(index, (a,b) => anylist[a].CompareTo(anylist[b])); 
+0

वाह! बहुत शानदार है। वही है जो मुझे एक पंक्ति में चाहिए था। मुझे लगता है कि यह लिंक का उपयोग करना चाहिए। मैंने इसका अध्ययन नहीं किया है और इसलिए यह नहीं पता कि यह कैसे काम करता है ... अनुमान है कि मुझे कुछ अध्ययन करने की ज़रूरत है। धन्यवाद! –

+1

नहीं, कोई LINQ नहीं है, लेकिन एक लैम्ब्डा अभिव्यक्ति है जिसका उपयोग आमतौर पर LINQ के साथ किया जाता है। – Guffa

+2

और यदि आपकी सरणी तुलनीय नहीं है, तो इसकी केवल 1 और पंक्ति: तुलनात्मक तुलनाकर्ता = तुलनात्मक डीफॉल्ट; ऐरे। सॉर्ट (इंडेक्स, (ए, बी) => तुलनाकर्ता। कॉम्पारेयर (सरणी [ए], सरणी [बी])); –

0

निम्नलिखित कोड एक अनुक्रमित तरह achievs। डेटा सरणी क्लोन करने के लिए ToArray() कॉल पर ध्यान दें। यदि छोड़ा गया है, तो डेटा सरणी भी क्रमबद्ध हो जाती है।

static void Main(String[] args) 
{ 
    Int32[] data = new Int32[] { -6, 6, 5, 4, 1, 2, 3, 0, -1, -2, -3, -4, -5 }; 

    Int32[] indices = Enumerable.Range(0, data.Length).ToArray(); 

    Array.Sort(data.ToArray(), indices); 

    foreach (Int32 index in indices) 
    { 
     Console.Write(String.Format("{0} ", data[index])); 
    } 

    Console.ReadLine(); 
} 

आउटपुट अपेक्षित है।

-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 
+0

नहीं, यह इंडेक्स प्रकार नहीं है, इसके परिणामस्वरूप घटना का हिस्सा हिस्सा इंडेक्स सॉर्ट जैसा ही है। – Guffa

+0

सूचकांक में आइटम फिर से हो गए हैं ताकि डाटा [इंडेक्स [i]] मैं डेटा में 0 के लिए। लम्बाई क्रमबद्ध क्रम में डेटा के तत्व उत्पन्न करता है। यह एक सूचकांक प्रकार है। –

+0

मैं मानता हूं कि जिस तरह से किया गया है वह वास्तव में स्मार्ट नहीं है क्योंकि डेटा की प्रतिलिपि बनाकर इंडेक्स को क्रमबद्ध किया जाता है। परिणाम डेटा समाधान बड़े होने पर आपके समाधान की तुलना में वही महंगा है। –

संबंधित मुद्दे