2009-03-25 9 views
5

मेरे पास तारों का एक सेट है (~ 80 000) मैं केवल हिट द्वारा क्रमशः पहुंच सकता हूं। डॉक (int) .Get ("fieldName") विधि।लूप के भीतर से अद्वितीय तारों की सूची बनाने का सबसे तेज़ तरीका?

List<string> idStrings = new List<string>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) 
{ 
    string idString = hits.Doc(i).Get("id"); 
    if (!idStrings.Contains(idString)) 
     idStrings.Add(idString); 
} 

तारों को बाद में int होना होगा। ट्राईपर्स() 'डी। मुझे लगता है कि ऐसा करने का एक तेज़ तरीका होना चाहिए। कोई सुझाव?

उत्तर

13

सबसे पहले, एक सूची के बजाय एक Hashset<string> उपयोग करते हैं, शामिल हैं विधि तेज हो जाएगा:

int count = hits.Length(); 
Hashset<string> idStrings = new Hashset<string>(); 

संपादित करें: आप कॉल करने के लिए नहीं है "इसमें शामिल है" यदि आप के रूप में यह कर सकते हैं एक HashSet का उपयोग डुप्लिकेट आइटम नहीं है। बस जोड़ें का उपयोग करें, यह स्वचालित रूप से डुप्लिकेट मान हटा देगा।

+1

सहमत - List.Contains() एक हे (एन) कार्य है। हैशसेट। संपर्क ओ (1) है। – itsmatt

+0

बढ़िया, यह वही है जो मैं सोच रहा था मुझे याद रखना चाहिए, लेकिन नहीं। उम्मीद है कि किसी को भी सेंस बनाता है: पी –

+0

कृपया ध्यान दें कि एक int द्वारा क्षमता निर्धारित करने के लिए कोई अधिभार नहीं है। –

0

बयान है कि अपने कोड को धीमा कर देती idStrings.Contains(idString) है।

आप List की तुलना में एक तेजी से डाटा संरचना का उपयोग कोशिश कर सकते हैं (एक पेड़ या एक हैश तालिका शायद?)।

विशेष रूप से, आपको उपलाइन खोज समय के साथ डेटा संरचना की आवश्यकता है। हैश टेबल में निरंतर खोज समय होता है, जबकि पेड़ों में आमतौर पर लॉगरिदमिक खोज समय होता है।

1
एक List के बजाय एक Dictionary

का प्रयोग करें। Dictionary.ContainsKey विधि List.Contains विधि से बहुत तेज है।

Dictionary<string, int> idStrings = new Dictionary<string, int>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) { 
    string idString = hits.Doc(i).Get("id"); 
    if (!idStrings.ContainsKey(idString)) { 
     idStrings.Add(idString, 1); 
    } 
} 

आप ढांचे 3.5 का उपयोग करते हैं तो आप एक HashSet बजाय Dictionary एक के उपयोग कर सकते हैं:

HashSet<string> idStrings = new HashSet<string>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) { 
    string idString = hits.Doc(i).Get("id"); 
    idStrings.Add(idString); 
} 
संबंधित मुद्दे