2009-08-27 12 views
18

मैं एक वर्ग MyClass है, और मुझे सूची के उदाहरण की विधि toString() ओवरराइड करने के लिए करना चाहते हैं:अधिभावी toString() सूची की <MyClass>

:

class MyClass 
{ 
    public string Property1 { get; set; } 
    public int Property2 { get; set; } 
    /* ... */ 
    public override string ToString() 
    { 
     return Property1.ToString() + "-" + Property2.ToString(); 
    } 
} 

मैं निम्नलिखित करना चाहते हैं

var list = new List<MyClass> 
      { 
       new MyClass { Property1 = "A", Property2 = 1 }, 
       new MyClass { Property1 = "Z", Property2 = 2 }, 
      }; 

Console.WriteLine(list.ToString()); /* prints: A-1,Z-2 */ 

क्या ऐसा करना संभव है? या मुझे अपने उप-वर्ग में विधि ToString() को ओवरराइड करने के लिए सूची < MyClass> को उप-वर्ग करना होगा? क्या मैं एक्सटेंशन विधियों का उपयोग करके इस समस्या को हल कर सकता हूं (यानी, क्या एक विस्तार विधि के साथ एक विधि को ओवरराइड करना संभव है)?

धन्यवाद!

+0

जानकारी के लिए: मैं एनएचबर्ननेट से संबंधित कुछ करने की कोशिश कर रहा था, और एक धारावाहिक स्ट्रिंग में संग्रहों का मानचित्रण जो एक कॉलम फिट होगा। हालांकि मुझे अपने स्वयं के IUserType को लागू करके इसे करने का एक और तरीका मिला, और मेरा कार्यान्वयन स्ट्रिंग को बनाता है जैसा मुझे चाहिए! धन्यवाद हर कोई जिसने उत्तर दिया! –

उत्तर

21

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

public class MyTypeList : List<MyClass> 
{ 
    public override string ToString() 
    { 
     return ... 
    } 
} 

संपादित जोड़ने के लिए:

नहीं, आप एक विस्तार बनाने के द्वारा एक विधि ओवरराइड नहीं कर सकते, लेकिन आप एक अलग हस्ताक्षर है कि इस प्रकार की सूची के लिए विशिष्ट है के साथ एक नई विधि बना सकते हैं:

public static string ExtendedToString(this List<MyClass> list) 
{ 
    return .... 
} 

साथ प्रयुक्त मैं अब भी लगता है कि आप से बेहतर उपवर्गीकरण हालांकि रहे हैं ...

+1

यह नई सूची वर्ग के लिए इतना छोटा कोड है, इसलिए मैं इसे उसी कोड फ़ाइल में 'MyClass' वर्ग' के रूप में शीर्ष पर शामिल करूंगा। तो यह करने के लिए बहुत अधिक प्रयास नहीं है, भले ही यह एक नई कक्षा बनाने के लिए जटिल लगता है, यह वास्तव में ऐसा नहीं है क्योंकि अधिकांश कार्यक्षमता 'सूची' वर्ग से विरासत में मिली है ... – awe

+0

** विस्तार के बारे में विधि: ** मैं इस बात से सहमत हूं कि इस मामले में आपको उप-वर्गीकरण के साथ जाना चाहिए, क्योंकि 'ToString' विधि तार्किक रूप से आप चाहते हैं, और' सूची' में इसका बहुत उपयोगी डिफ़ॉल्ट कार्यान्वयन नहीं है। एक्सटेंशन एक नई विधि जोड़ देगा और 'ToString' विधि को वहां बेकार के रूप में छोड़ देगा क्योंकि यह हमेशा सामान्य' सूची 'वर्ग के लिए रहा है। – awe

0

आप की overwride ToString() विधि है कि संग्रह से विरासत अपने स्वयं के कस्टम वर्ग बनाना होगा और उसके बाद उस वर्ग विशेष रूप से।

2

यदि आपको विधि ToString नाम दिया जाना चाहिए तो आपको List से कक्षा प्राप्त करनी होगी। आप इसे एक सामान्य बना सकते हैं:

static class MyList<T> : List<T> 
{ 
    public override string ToString() 
    { 
     // ... 
    } 
} 

इस मामले में, आप अगर आप अपने कस्टम रूपांतरण करना चाहते हैं अपने आवेदन भर List के बजाय MyList का उपयोग करना होगा।

लेकिन, आप अपने विधि के लिए एक अलग नाम का चयन कर सकते हैं, तो आप विस्तार तरीकों का उपयोग और एक ही प्रभाव को प्राप्त, अपने कोड में नहीं के बराबर संशोधनों के साथ कर सकते हैं:

आप इस अधिक सामान्य बनाने के लिए विस्तार तरीकों का उपयोग कर सकते हैं :

static class ListExtension 
{ 
    public static void ConvertToString<T>(this IEnumerable<T> items) 
    { 
     // ... 
    } 
} 

आप इसे IEnumerable<T> के किसी भी मामले पर उपयोग कर सकते हैं बस के रूप में अगर यह एक साधारण विधि थे:

List<MyClass> list = new List<MyClass> { ... }; 
Console.WriteLine(list.ConvertToString()); 

int[] array_of_ints = {1,2,3,4,5}; 
Console.WriteLine(array_of_ints.ConvertToString()); 
0

कोई अपनी नहीं पी ossible। टीएलिस्ट की ToString आपको सूची वस्तु का स्ट्रिंग प्रतिनिधित्व देगा।

आपके विकल्प हैं:

TList से
  • निकाले जाते हैं और .ToString() विधि ओवरराइड के रूप में आप का उल्लेख किया।(इस उदाहरण में मैं ऐसा करने के लायक नहीं कहूंगा)
  • एक सहायक विधि बनाएं जो एक टीएलआईस्ट सूची को अल्पविराम सीमांकित स्ट्रिंग में परिवर्तित करे। विस्तार विधि (शायद सबसे अच्छा सुझाव)
  • Console.WriteLine चरण पर एक foreach कथन का उपयोग करें।

आशा है कि मदद करता है!

21

शायद थोड़ा सा विषय, लेकिन मैं ToDelimitedString एक्सटेंशन विधि का उपयोग करता हूं जो किसी भी IEnumerable<T> के लिए काम करता है।

// if you've already overridden ToString in your MyClass object... 
Console.WriteLine(list.ToDelimitedString()); 
// if you don't have a custom ToString method in your MyClass object... 
Console.WriteLine(list.ToDelimitedString(x => x.Property1 + "-" + x.Property2)); 

// ... 

public static class MyExtensionMethods 
{ 
    public static string ToDelimitedString<T>(this IEnumerable<T> source) 
    { 
     return source.ToDelimitedString(x => x.ToString(), 
      CultureInfo.CurrentCulture.TextInfo.ListSeparator); 
    } 

    public static string ToDelimitedString<T>(
     this IEnumerable<T> source, Func<T, string> converter) 
    { 
     return source.ToDelimitedString(converter, 
      CultureInfo.CurrentCulture.TextInfo.ListSeparator); 
    } 

    public static string ToDelimitedString<T>(
     this IEnumerable<T> source, string separator) 
    { 
     return source.ToDelimitedString(x => x.ToString(), separator); 
    } 

    public static string ToDelimitedString<T>(this IEnumerable<T> source, 
     Func<T, string> converter, string separator) 
    { 
     return string.Join(separator, source.Select(converter).ToArray()); 
    } 
} 
+0

सामान्य रूप से अच्छा सुझाव: मैं स्वयं भी ऐसी विस्तार विधि का उपयोग करता हूं। मूल प्रश्न के सटीक संदर्भ के आधार पर यह यहां एक वैध उत्तर हो सकता है या नहीं। – peSHIr

+0

ये कुछ वास्तव में आसान विस्तार विधियां हैं, धन्यवाद! मुझे अज्ञात एनम प्रकारों के आईएलआईस्ट का उपयोग करके एक कॉमा सेपरेटेड सूची में परिवर्तित करने के लिए एक फ़ंक्शन के अंदर लोड करने में मदद मिली, बस मेरे कन्वर्टर पैरामीटर के रूप में उपयोग किया गया (x => ((छोटा) कनवर्ट करें। चेंजटाइप (एक्स, टाइपकोड.इन्ट 16)। धन्यवाद दोबारा ल्यूक –

+0

डैनरिकर्डसन टिप्पणी के अनुसार, इनपुट के लिए धन्यवाद यह काफी उपयोगी है! –

0

सही कारण आप चाहते के लिए है पर निर्भर करता है List<T>.ToString() ओवरराइड करने के लिए कुछ विशिष्ट वापस जाने के लिए यह काम हो सकता है: आप (वैकल्पिक) सीमांकक उपयोग करने के लिए और एक प्रतिनिधि प्रत्येक तत्व के लिए एक कस्टम स्ट्रिंग रूपांतरण करने के लिए निर्दिष्ट कर सकते हैं कस्टम TypeConverter कार्यान्वयन पर एक नज़र डालने के लिए।

आप बस विशिष्ट T के List<T> चाहते हैं अपने आप में उन स्थानों में जहां TypeConverters डीबगर में या string.Format("List: {0}", listVariable) प्रकार स्थितियों में की तरह इस्तेमाल किया जाता है, में एक string के रूप में एक निश्चित तरीके से दिखाने के लिए, यह पर्याप्त हो सकता है।

आपने शायद कहीं भी दिखाया जा रहा To Toring() का परिणाम देखा होगा और TypeConverter और उन स्थानों पर जहां उनका उपयोग किया जा रहा है, के अस्तित्व के बारे में जानने के बिना इसे बदलना चाहते हैं। मुझे लगता है कि .NET Framework में डिफ़ॉल्ट TypeConverters के कई/अधिकांश/सभी (सुनिश्चित नहीं हैं?) का उपयोग केवल ToString() का उपयोग करते हैं, जब किसी भी प्रकार को परिवर्तित करते हैं जिसके लिए उन्हें string के लिए परिभाषित किया जाता है।

2

आप वास्तव में एक यूनिकोड चाल का उपयोग कर सकते हैं ताकि आप अपनी सामान्य सूची के विरुद्ध सीधे वैकल्पिक टॉस्ट्रिंग विधि को परिभाषित कर सकें।

आप दृश्य स्टूडियो में हेक्स चरित्र इनपुट सक्षम हैं तो आप Alt कुंजी को दबाए रखते है, तो अपने संख्यात्मक कीपैड पर निम्नलिखित का उपयोग करके अदृश्य वर्ण बना सकते हैं + FFF 9 (अब Alt जारी)

तो हम बना सकते हैं जैसा कि इसके नाम के बगल में रखा एक अदृश्य चरित्र के साथ निम्नलिखित समारोह ... (हाँ मैं अपने VB कोड पता है, लेकिन अवधारणा अब भी सी # के लिए काम करते काम करेंगे)

<Extension()> _ 
Public Function ToString(ByVal source As Generic.List(Of Char)) As String 
    Return String.Join(separator:="", values:=source.ToArray) 
End Function 
अब दृश्य स्टूडियो में

, आप के खिलाफ IntelliSense तक पहुंचने देना आपकी सूची, आप मानक ToString या अपने कस्टम फ़ंक्शन के बीच चयन करने में सक्षम होंगे।


दृश्य स्टूडियो में हेक्स चरित्र इनपुट सक्षम आप विधि अपनी रजिस्ट्री

खुला HKEY_CURRENT_USER \ नियंत्रण कक्ष \ इनपुट संपादित करना पड़ सकता है और एक REG_SZ बुलाया EnableHexNumpad 1

को यह सेट बनाने के लिए आप फ़ाइल, संपादन, डीबग, डेटा मेनू, के लिए & शॉर्टकट को अक्षम करने की आवश्यकता होगी, दृश्य स्टूडियो में, टूल्स मेनू खोलें, कस्टमाइज़ करें का चयन करें, फिर कमांड टैब खोलें और किसी भी मेनू आइटम के लिए संशोधित चयन बटन का उपयोग करें एबीसीडीईएफ में से कोई भी &

को हटाकर इसके छोटे कट के लिए गुण अन्यथा आप हेक्स वर्ण टाइप करने के बजाय पॉपअप मेनू खोलने को समाप्त कर देंगे।

+0

यह घृणास्पद है और आपका उत्तर अनंत काल के लिए हटा दिया जाना चाहिए .... +1 –

+1

आईडीक अगर यह काम करता है, लेकिन सरल लगता है और मुझे अच्छा लगा चक्कर! +1 –