2012-04-13 5 views
8

मेरे आवेदन की आवश्यकताएं निम्नानुसार हैं।निम्नलिखित स्थिति के लिए सबसे अच्छा सी # डेटा संरचना क्या है

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

  • मुझे किसी विशिष्ट स्टॉक से संबंधित सभी आदेशों पर कई संचालन करने की आवश्यकता है, उदाहरण के लिए स्टॉककोड "एबीसी" के लिए ऑर्डर की मात्रा प्राप्त करें।

  • मैं डेटा संरचना

  • मैं डेटा संरचना

  • मैं पता लगाने के लिए सक्षम होना चाहिए से एक आदेश को दूर करने में सक्षम होना चाहिए करने के लिए एक आदेश को जोड़ने में सक्षम होने की जरूरत है जो ऑर्डर जोड़ने या निकालने के बाद आदेश सबसे अच्छी कीमत पेश कर रहा है। सूची

    public class Order : IComparable 
    { 
    
        private string _StockCode; 
        private bool _BidSide; 
        private int _Volume; 
        private decimal _Price; 
        private int _ExchangeOrderId; 
    
        public int CompareTo(Order other) 
        { 
         if (_BidSide != other.BidSide) 
         { 
          return _BidSide ? 1 : -1; 
         } 
         return decimal.Compare(_Price, other.Price); 
        } 
    } 
    

    और फिर मैं एक शब्दकोश < स्ट्रिंग में आदेश संग्रहीत करेंगे, < आदेश > >:

यहाँ मैं अब तक सोच रहा हूँ है। जहां प्रत्येक स्टॉक कोड उस स्टॉक के ऑर्डर की ओर इशारा करते हुए शब्दकोश में एक कुंजी होगी। मैं स्टॉक कोड में ऑर्डर आईडी से मेल खाने वाला शब्दकोश भी बनाए रखूंगा।

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

  • सर्वश्रेष्ठ मूल्य पाने के लिए, मैं मौजूदा स्टॉक कोड के लिए शब्दकोश में आदेश सूची को देखने के लिए, सूची को सॉर्ट और सर्वोच्च क्रम प्रिंट आउट।

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

+0

कुछ बेवकूफ, लेकिन मानकों का कहना है कि _ लोअरकेस के बाद। –

+0

"वर्तमान स्टॉक कोड के लिए बहुत सारे ऑर्डर होने पर यह स्पष्ट रूप से अक्षम है।" हां और ना। यह इस बात पर निर्भर करता है कि "बहुत" क्या है और आप कितनी बार ऑर्डर हटाने की उम्मीद करते हैं। यदि आप एक सेकंड में सैकड़ों ऑर्डर हटा रहे हैं और आपके पास प्रति शेयर 1,000 ऑर्डर हो सकते हैं, तो यह धीमा होने जा रहा है। लेकिन यदि आप स्टॉक के लिए दर्जनों ऑर्डर की बात कर रहे हैं और ऑर्डर हटाना अकसर है, तो "अक्षमता" कोई समस्या नहीं है। –

+3

किसी भी कारण से यह डेटाबेस में नहीं है? वे इस तरह के व्यवहार के लिए दर्जी बने हैं ... – Telastyn

उत्तर

1

यदि आप इसे बहुत से डेटा के साथ करने जा रहे हैं, तो इसे डेटाबेस में रखें। यह ऐसा कुछ नहीं है जिसे आप कक्षा में करना चाहते हैं।

हालांकि, अगर आप डेटा का एक छोटा सेट का उपयोग कर रहे हैं, तो आप इस कोड में LINQ का उपयोग कर सकता है।

मुझे लगता है कि आपको ऑर्डर को IEnumerable लागू करना चाहिए और फिर अपने ऑर्डर को स्टोर करने के लिए List<Order> का उपयोग करना चाहिए।StockCodeOrder पर एक सार्वजनिक संपत्ति करें और फिर आप का उपयोग करके आदेश प्राप्त कर सकते हैं Linq:

सूची से
List<Order> orders = GetOrderList(); 

var ibmOrders = from o in orders 
    where o.StockCode == "IBM" 
    select o; 

आइटम निकाले जा रहे काफी सरल है:

List<Order> orders = GetOrderList(); 

var orderToRemove = (from o in orders 
    where o.ExchangeId == 1315 
    select o).FirstOrDefault(); 

if (orderToRemove != null) { 
    orders.Remove(orderToRemove); 
} 

ढूँढना सर्वश्रेष्ठ मूल्य Linq का उपयोग करके काफी अच्छा है :

Order bestPricedOrder = (from o in orders 
     orderby Price 
     select o).FirstOrDefault(); 

अधिक महान LINQ चाल के लिए, 101 LINQ Samples देखते हैं।

+0

लिंक में न्यूनतम/अधिकतम सभी ओ (एन) है। यदि वस्तुओं की उचित संख्या, लगातार पहुंच आदि हैं तो यह एक कुशल विकल्प नहीं है। यह वास्तव में ओपीएस सुझाव से भी बेहतर नहीं है। इसके अलावा, 'ऑर्डर' ओपी के पढ़ने से एकवचन है। आदेशों के संग्रह के लिए आपको एक नई कक्षा बनाना होगा। ओपी सूची का इस्तेमाल किया। ऑर्डर की सूची में जोड़ें/निकालें 'डिक्शनरी' जोड़ने/निकालने से कहीं भी बदतर होगा। – Servy

+0

अच्छे विचार Servy। मैंने नहीं देखा कि ओपी कितने ऑब्जेक्ट्स का उपयोग करने की योजना बना रहा था, इसलिए मैंने सोचा कि LINQ डेटा के छोटे सेट के लिए एक सुझाव होगा। मुझे यह भी लगता है कि LINQ अधिक पढ़ने योग्य कोड (पढ़ना: रखरखाव योग्य) का नेतृत्व करेगा और इसलिए मूल दृष्टिकोण से बेहतर समाधान होगा। –

+1

ओपी का उपयोग करने वाले सभी डेटा संरचनाओं को 'आईनेमेरेबल' लागू किया जाता है, ताकि आप अभी भी LINQ का उपयोग कर सकें। आपका कोड उस संबंध में कोई सुधार नहीं जोड़ता है।इसके अलावा, अगर कोई पूछता है, "क्या ऐसा करने के लिए एक और अधिक प्रभावी तरीका है" और आपको लगता है कि प्रदर्शन कोई मुद्दा नहीं है, बस इतना कहें और उन्हें कुछ कम प्रदर्शन करने के बजाए जो कुछ भी करने की बजाय उन्हें करने दें। मैं सहमत हूं कि प्रदर्शन एक मुद्दा नहीं हो सकता है, लेकिन अगर ओपी कहता है कि मैं वैधता पर सवाल करता हूं तो भी मैं जवाब दूंगा। – Servy

0

मैं टिप्पणियों से सहमत हूं कि डेटाबेस सबसे अच्छा विकल्प होगा; वे इस तरह की चीज के लिए डिजाइन किए गए हैं।

यदि आपको स्मृति में इस डेटा को पकड़ने की आवश्यकता है, और वास्तव में प्रति कोड बहुत सारे ऑर्डर हैं, तो मैं Dictionary<string, SortedSet<Order>> के साथ जाऊंगा। सॉर्टेडसेट न्यूनतम/अधिकतम आसान, साथ ही त्वरित सम्मिलन/निष्कासन को भी ढूंढ देगा।

+0

यदि आपको दृढ़ता, लेन-देन और इस तरह की चीजों की आवश्यकता है, तो डेटाबेस जाने का तरीका है। एक मेमोरी समाधान में ओपी की जरूरतों के आधार पर काफी तेजी से (स्पष्ट रूप से) और आदर्श हो सकता है (जो मैं अनुदान देता हूं कि मुझे भी दृढ़ता और लेनदेन की आवश्यकता होगी;) शायद ओपी सिर्फ कंप्यूटर को बंद करने या इसे रखने की योजना बना रहा है क्रैश;) जब डेटा बहुत बड़ा हो जाता है तो गर्म मेमोरी स्वैप सहित: डी – Jordan

+0

मुझे लगता है कि एक उदाहरण के रूप में एएसपीनेट सत्र देख सकता है। वे आपकी आवश्यकताओं के आधार पर मेमोरी सेट, एक स्टेट सर्वर और डेटाबेस विकल्प में एक का समर्थन करते हैं। – Jordan

1

मैं एक अतिरिक्त शब्दकोश जोड़ूंगा, जिसमें कुंजी कोड के प्रारंभिक शब्दकोश में सूची में ऑर्डर करने के लिए key = orderid, value = संदर्भ शामिल होगा।

यह एक सूचकांक की तरह कार्य करेगा और आपको निरंतर समय हटाने देगा। मान लें कि आपको ऑर्डर आईडी अलग है, यह 1: 1 को मैप करेगी। बस सुनिश्चित करें कि आप इसे दोनों शब्दकोशों से हटा दें।

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

+0

पीएस से ओपी, कूल नाम फोन्ज़ी;) – Jordan

+1

उसी स्वाद में, मैं एक कक्षा जोड़ूंगा जो बोलियों की स्थिति को औसत, उच्चतम बोली, आदि को कैश करने के लिए वर्णित करेगी - जिसे बोलियों के प्रत्येक निष्कासन/जोड़ के साथ अपडेट किया जाएगा, और वर्तमान बोलियों की सूची स्टोर करेगा। इस तरह, आपका अपडेट बहुत तेज़ हो सकता है। डेटाबेस में जाने के लिए अन्य सभी सुझाव मूल्य जोड़ते हैं लेकिन जटिलता, इन-मेमोरी एन्यूमेरबल्स पर PLINQ का उपयोग करने के अलावा आप अविश्वसनीय प्रदर्शन प्राप्त कर सकते हैं। – payo

+1

@payo कैशिंग पूरे सौदे के लिए सबसे अच्छी कीमत खराब नहीं होगी, लेकिन प्रत्येक कोड के लिए सबसे अच्छी कीमत कैशिंग बहुत तेजी से बढ़ जाएगी, और अतिरिक्त लाभ के मामले में लगभग उतना ही नहीं खरीदेंगे। मैं तब तक इससे बचूंगा जब तक कि यह प्रोफाइलिंग प्रोफाइलर को साबित न करे। – Servy

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