2010-01-03 10 views
11

मेरे पास ~ 9 000 उत्पादों की एक सूची है, और इनमें से कुछ में डुप्लिकेट हो सकते हैं।मैं .NET में हैशटेबल्स/हैशसेट्स का उपयोग कैसे करूं?

मैं इन उत्पादों का एक हैशटेबल उत्पाद सीरियल नंबर के साथ अपनी कुंजी के रूप में बनाना चाहता था ताकि मैं आसानी से डुप्लिकेट पा सकूं।

सी #/.NET में हैशटेबल का उपयोग करने के बारे में कोई कैसे होगा? क्या हैशसेट अधिक उपयुक्त होगा?

की-सीरियल:

अंततः मैं की तरह एक सूची चाहते हैं 11110 - शामिल है: उत्पाद 1
की-सीरियल: 11111 - शामिल है: Product3, Product6, Product7
की-सीरियल: 11112 - शामिल है: product4
की-सीरियल: 11113 - शामिल है: Product8, Product9

तो, मैं सभी उत्पादों की एक सूची है, और वे लोगों को नकली सीरियल नंबर है कि द्वारा वर्गीकृत किया है। ऐसा करने के लिए "सही" तरीका क्या है?

उत्तर

1

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

उदाहरण:

struct ProductPrimaryKey 
{ 
    public string KeySerial; 
    public string OtherDiscriminator; 

    public ProductPrimaryKey(string keySerial, string otherDiscriminator) 
    { 
     KeySerial = keySerial; 
     OtherDiscriminator = otherDiscriminator; 
    } 
} 

class Product 
{ 
    public string KeySerial { get; set; } 
    public string OtherDiscriminator { get; set; } 
    public int MoreData { get; set; } 
} 

class DataLayer 
{ 
    public Dictionary<ProductPrimaryKey, Product> DataSet 
     = new Dictionary<ProductPrimaryKey, Product>(); 

    public Product GetProduct(string keySerial, string otherDiscriminator) 
    { 
     return DataSet[new ProductPrimaryKey(keySerial, otherDiscriminator)]; 
    } 
} 
9

मुझे लगता है कि शब्दकोश इस तरह सामान के लिए सिफारिश की वर्ग है।

यह

Dictionary<string, List<Product>> 

(कुंजी के रूप में धारावाहिक स्ट्रिंग का उपयोग)

+0

यह एक क्लज है, आप सूची से सही उत्पाद कैसे चुन सकते हैं? एक अद्वितीय कुंजी के लिए कोई विकल्प नहीं है। –

+7

यह एक कड़वाहट क्यों है? सवाल सीरियल द्वारा उत्पादों को समूहीकृत करने के बारे में था। यह एक सीधा, सरल और पठनीय उत्तर है जो आवश्यकताओं को पूरा करता है, नहीं? –

6

एक सामान्य शब्दकोश यह सबसे अच्छा सूट अपने मामले में कुछ इस तरह हो सकता है, मुझे लगता है। कोड कुछ इस तरह दिख सकता है:

var keyedProducts = new Dictionary<int,List<string>>(); 

foreach (var keyProductPair in keyProductPairs) 
{ 
    if (keyedProducts.Contains(keyProductPair.Key)) 
    keyedProducts[keyProductPair.Key].Add(keyProductPair.Product); 
    else 
    keyedProducts.Add(keyProductPair.Key, new List<string>(new[]{keyProductPair.Product})); 
} 
7

एक hashtable शब्दकोश का एक प्रकार है, और एक HashSet सेट का एक प्रकार है। न तो शब्दकोश और न ही सीधे आपकी समस्या को हल करता है - आपको एक डेटा संरचना की आवश्यकता होती है जिसमें एक कुंजी के लिए एकाधिक ऑब्जेक्ट होते हैं।

ऐसे डेटाबेस अक्सर मल्टीमैप्स कहा जाता है। आप केवल हैशटेबल का उपयोग करके एक बना सकते हैं जहां कुंजी के प्रकार पूर्णांक होते हैं और मानों के प्रकार किसी प्रकार के सेट होते हैं (उदाहरण के लिए, हैशसेट ...)।

वैकल्पिक रूप से, आप मौजूदा मल्टीमैप समाधान देख सकते हैं, जैसे कि: multimap in .NET

हैशटेबल्स का उपयोग करने के बारे में जानकारी के लिए, आप इसे एमएसडीएन पर देख सकते हैं: http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx, और कई अन्य ट्यूटोरियल हैं - या तो "हैशटेबल" या "डिक्शनरी" का उपयोग करने पर खोजें।

0

तो आप बस, आप कर सकते थे डुप्लिकेट की एक सूची है चाहता था:

  • ले अपनी मेज प्रविष्टियों की एक Dictionary<T> बनाने (यह IEnumerable<T> (फोन जो डुप्लिकेट चाबी पर ध्यान नहीं देता)

  • बना सकते हैं Hashset<T> उसी IEnumerable<T> (जो डुप्लिकेट कुंजी रखता है, जब तक पूरी पंक्ति समान नहीं होती है)

  • और फिर dictionary.Values के माध्यम से फिर से चालू करें, प्रत्येक मान

hashset में क्या बचा है डुप्लिकेट है।

1

.NET में अब उपलब्ध एक शानदार विकल्प Lookup कक्षा है। एमएसडीएन दस्तावेज से:

एक लुकअप (टीकेई, टेलीमेंट) का एक शब्दकोश (टीकेई, टीवीएयू) जैसा दिखता है। अंतर यह है कि एक डिक्शनरी (टीकेई, टीवीएयू) मैप्स कुंजियों को एकल मानों के लिए, जबकि एक लुकअप (टीकेई, टेलीमेंट) की नक्शा कुंजी मूल्यों के संग्रह के लिए।

are some differences एक लुकअप और डिक्शनरी (सूची) के बीच। अर्थात्, लुकअप अपरिवर्तनीय है (इसे बनाए जाने के बाद तत्व या कुंजी को जोड़ या हटा नहीं सकता है)। आप अपने डेटा का उपयोग करने की योजना बनाने के आधार पर, लुकअप लाभदायक compared to GroupBy() हो सकता है।

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