2011-05-24 30 views
6

डेल्फी 6 में यदि आप किसी ऑब्जेक्ट को एक TStringList में डालने का प्रयास करते हैं जो सॉर्ट किया गया है (सॉर्ट किया गया = सत्य) एक अपवाद आपको चेतावनी दी जाती है कि सॉर्ट की गई सूची पर InsertObject() की अनुमति नहीं है। अगर मैं InsertObject() को कॉल करना चाहता हूं तो मैं इसे समझ सकता हूं, सूची के क्रमबद्ध क्रम को नष्ट करना आवश्यक है। लेकिन यह देखते हुए कि TStringList.Find() विधि:डेल्फी की TStringList.InsertObject() विधि सूची को सॉर्ट किए जाने पर अपवाद को क्यों फेंक दिया जाता है?

function TStringList.Find(const S: string; var Index: Integer): Boolean; 

एक सूचकांक रिटर्न अगर यह सूची में जोड़ा गया, कि सूचकांक के साथ InsertObject() कॉल आप वास्तव में क्या प्रविष्टि सूचकांक एक दिया स्ट्रिंग के लिए किया जाना चाहिए कह चाहिए ऑपरेशन के बाद सॉर्ट किए गए क्रम में सॉर्ट की गई सूची को अभी भी छोड़ दें। मैंने TStringList के लिए डेल्फी स्रोत की जांच की है और ऐसा लगता है कि मेरा दावा है।

अभी के लिए मैं केवल TStringList के लिए एक नया उप-वर्ग बना रहा हूं जो InsertObject() को ओवरराइड करता है और सॉर्टेड सूची पर InsertObject() को कॉल किया जाता है, लेकिन अपवाद नहीं फेंकता है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि कुछ नहीं है छुपा खतरे जो मैं अभी नहीं देख रहा हूं।

- roschler

+2

आप क्यों नहीं बस नहीं है 'AddObject'' पर कॉल करें और यह सही इंडेक्स पर जादुई रूप से जोड़ा जाएगा? –

उत्तर

7

आपको बस क्रमबद्ध सूची में AddObject पर कॉल करना चाहिए।

यदि InsertObject सॉर्टेड सूचियों पर 'सही' इंडेक्स के लिए चेक किया गया है, तो आपके पास एक परीक्षण दुःस्वप्न होगा: कुछ परिस्थितियों में, आपका कोड काम पर दिखाई देगा, लेकिन अचानक इनपुट डेटा बदलने पर अपवाद फेंकना शुरू हो जाएगा। या, यदि InsertObject ने Index पैरामीटर को अनदेखा किया, तो इसका व्यवहार जंगली रूप से गैर-सहज ज्ञान युक्त होगा।

यह सूची को सॉर्ट करने के लिए हमेशा InsertObject के लिए बेहतर है।

+0

यदि आप किसी अन्य कारण के लिए इंडेक्स भी चाहते हैं: 'AddObject' इंडेक्स देता है। और यह तय करने के लिए कि क्या ऑब्जेक्ट को स्वयं जोड़ना है, अपने आप को मिली इंडेक्स के आधार पर, कोड Sertac Akyuz देखें। – NGLN

1

Delphi6 जाँच करने के लिए नहीं है, लेकिन यह डेल्फी XE में एक ही है। यदि सूची सॉर्ट की गई है तो आपको इसके बजाय AddObject का उपयोग करना चाहिए। जब सूची आपके लिए वस्तुओं को सॉर्ट कर रही है तो किसी ऑब्जेक्ट को किसी विशिष्ट स्थिति पर डालने के लिए वास्तव में समझ में नहीं आता है।

3

त्रुटि संदेश मुझे बहुत स्पष्ट लगता है: इसे एक क्रमबद्ध TStringlist पर सम्मिलित या सम्मिलित करने के लिए अनुमति नहीं है। सॉर्ट किए जाने पर, स्ट्रिंगलिस्ट सूची को क्रमबद्ध रखने के लिए स्वचालित रूप से नई प्रविष्टि की स्थिति को संभालेगी। मान लीजिए सम्मिलित करने की अनुमति थी, स्ट्रिंगलिस्ट कैसे जान सकती है कि दिया गया इंडेक्स सॉर्टिंग तोड़ नहीं देता है? इसे सही इंडेक्स मिलना होगा, इसे दिए गए एक के साथ तुलना करें और फिर? या तो पाए गए एक का उपयोग करें या एक अपवाद फेंक दें। इस प्रकार केवल जोड़ें या AddObject की अनुमति है।

0

TStringList का उपयोग करें। इसके बजाय जोड़ें। यह स्वचालित रूप से डुप्लिकेट की जांच और सही जगह में स्ट्रिंग डाल देगा

+0

डुप्लिकेट्स संपत्ति के आधार पर http://docwiki.embarcadero.com/VCL/en/Classes.TStringList.Duplicates –

2

नकल करने द्विआधारी खोज Find द्वारा किए गए बचने के लिए आप संरक्षित InsertItem विधि का उपयोग कर सकते हैं:

type 
    THackSL = class(TStringList); 

... 

var 
    i: Integer; 
    s: string; 
begin 
    ... 
    if not MyStringList.Find(s, i) then 
    THackSL(MyStringList).InsertItem(i, s, nil); 
  
+0

प्रदर्शन युक्ति के लिए धन्यवाद। जानकार अच्छा लगा। –

+0

@Robert - आपका स्वागत है! लेकिन मैं इसे एक जवाब के रूप में पोस्ट करना चाहता था, एक टिप नहीं। क्या मैंने आपके प्रश्न को गलत समझा? क्या आप अपनी उप-वर्गीकृत स्ट्रिंग सूची के साथ खोज डुप्लिकेशंस से परहेज नहीं कर रहे थे? –

+0

अच्छा, वास्तव में एक प्रदर्शन टिप नहीं: प्रश्नकर्ता ने पहले से ही 'Find' का उपयोग किया था।;) – NGLN