2010-01-28 11 views
11

कुछ ट्यूटोरियल के बाद और मैं सफलतापूर्वक एक संग्रह कक्षा बनाने में सक्षम था जो डेटाटेबल बनाने के लिए आवश्यक कार्यक्षमता को प्राप्त करता है जिसे पारित किया जा सकता है एक तालिका मान पैरामीटर के रूप में एक SQL सर्वर की संग्रहीत प्रक्रिया। सबकुछ अच्छी तरह से काम कर रहा है; मैं सभी पंक्तियों को जोड़ सकता हूं और यह सुंदर दिखता है। हालांकि, नज़दीकी निरीक्षण पर मैंने देखा कि जब मैं एक नई पंक्ति जोड़ता हूं, तो पिछली पंक्तियों के लिए डेटा नई पंक्ति के मूल्य के साथ ओवरराइट किया जाता है। तो यदि मेरे पास "foo" के स्ट्रिंग मान के साथ एक पंक्ति है और मैं "बार" मान के साथ दूसरी पंक्ति जोड़ता हूं, तो दूसरी पंक्ति डाली जाएगी (दो पंक्तियों के साथ डेटाटेबल बनाना) लेकिन दोनों पंक्तियों में मूल्य "बार होगा "। क्या कोई देख सकता है कि यह क्यों होगा? यहां कुछ कोड दिया गया है, जो काम करता है लेकिन थोड़ा सा सरल रहा है (स्पष्टीकरण की आसानी के लिए टैग क्लास को कम कर दिया गया है)।सूची में पिछले मानों को ओवरराइट करने के लिए <>

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using Microsoft.SqlServer.Server; 

namespace TagTableBuilder 
{ 
public class TagCollection : List<Tag>, IEnumerable<SqlDataRecord> 
{ 
    IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator() 
    { 
     var sdr = new SqlDataRecord(
      new SqlMetaData("Tag", SqlDbType.NVarChar) 
      ); 

     foreach (Tag t in this) 
     { 
      sdr.SetSqlString(0, t.tagName); 

      yield return sdr; 
     } 
    } 
} 

public class Tag 
{ 
    public string tagName { get; set; } 
} 
} 

ये इस प्रकार कहा जाता है:

निम्नलिखित संग्रह वर्ग के है

//Create instance of collection 
TagCollection tags = new TagCollection(); 

//Create instance of object 
Tag _tag = new Tag(); 

foreach (string t in tagList) 
{ 
    //Add value to class propety 
    _tag.tagName = t; 
    //Add class to collection, this is where all previously added rows are overwritten 
    tags.Add(_tag); 
} 
+0

हाँ, क्या मुझे इसे सही तरीके से ठीक करना चाहिए धन्यवाद! –

उत्तर

25

आप पाश अंदर Tag वस्तु का एक ही उदाहरण का उपयोग कर रहे है, इसलिए प्रत्येक अद्यतन करने के लिए टैगनाम एक ही संदर्भ के लिए है। पाश में से प्रत्येक के पास पर एक ताजा वस्तु प्राप्त करने के लिए लूप के अंदर घोषणा ले जाएँ:

foreach (string t in tagList) 
{ 
    Tag _tag = new Tag(); 

    //Add value to class propety 
    _tag.tagName = t; 
    //Add class to collection, this is where all previously added rows are overwritten 
    tags.Add(_tag); 
} 

भी ध्यान दें कि मैं _tag बजाय mTag जोड़ने के लिए के रूप में मैं इस कहीं भी परिभाषित नहीं दिख रहा है अंतिम पंक्ति अपडेट किया गया।

2

लूप में जहां आप संग्रह में टैग जोड़ते हैं, आप टैग के उसी ऑब्जेक्ट इंस्टेंस का उपयोग कर रहे हैं। अनिवार्य रूप से, आप एक टैग का नाम टैगलिस्ट में पहले मान पर सेट कर रहे हैं और उसे संग्रह में जोड़ रहे हैं, फिर आप उसी टैग का नाम टैगलिस्ट में दूसरे मान में बदल रहे हैं और उसे संग्रह में फिर से जोड़ रहे हैं।

टैग के आपके संग्रह में एक ही टैग ऑब्जेक्ट के कई संदर्भ हैं! टैग के नाम को सेट करने और संग्रह में जोड़ने से पहले हर बार लूप के अंदर इंस्टेंटिएट _टैग करें।