2009-12-01 16 views
55

मैं एक जेनेरिक एक्सटेंशन विधि विकसित करना चाहता हूं जो स्ट्रिंग को क्रमबद्ध क्रम में क्रमबद्ध क्रम में व्यवस्थित करना चाहिए।जेनेरिक एक्सटेंशन विधि कैसे बनाएं?

मैं

string[] names = { "Jon", "Marc", "Joel", 
        "Thomas", "Copsey","Konrad","Andrew","Brian","Bill"}; 

var query = names.OrderBy(a => a.Length).ThenBy(a => a); 

तरह से विकसित करने के लिए जेनेरिक एक्सटेंशन विधि क्या है मतलब है?

मैंने कोशिश की:

public static class ExtensionOperation 
    { 
     public static T[] AlphaLengthWise<T>(this T[] names) 
     { 
      var query = names.OrderBy(a => a.Length).ThenBy(a => a); 
      return query; 
     } 
    } 

मैंने प्राप्त किया:

त्रुटि 1: टी की लंबाई

त्रुटि 2 के लिए परिभाषा शामिल नहीं है: T[] करने के लिए System.Linq.IOrderedEnumerable परिवर्तित नहीं कर सकते। क्योंकि LengthString वर्ग के एक संपत्ति है, जबकि अपने जेनेरिक वर्जन में टी पैरामीटर के प्रकार ज्ञात नहीं है है

+4

यदि आप केवल तारों की व्यवस्था करना चाहते हैं तो यह सामान्य क्यों होना चाहिए? – bniwredyc

+6

@bniwredyc क्योंकि 'जेनेरिक' अच्छा लगता है! :) –

+0

सभी – user215675

उत्तर

80

पहले त्रुटि है। यह किसी भी प्रकार का हो सकता है।

दूसरी त्रुटि यह है कि आप केवल क्वेरी ऑब्जेक्ट लौटाते हैं लेकिन वास्तविक परिणाम नहीं। लौटने से पहले आपको ToArray() पर कॉल करने की आवश्यकता हो सकती है।

छोटे संशोधनों के साथ

आप इस के साथ आ सकता है:

public static class ExtensionOperation 
{ 
    public static IEnumerable<T> AlphaLengthWise<T, L>(
     this IEnumerable<T> names, Func<T, L> lengthProvider) 
    { 
     return names 
      .OrderBy(a => lengthProvider(a)) 
      .ThenBy(a => a); 
    } 
} 

जो तुम इस तरह इस्तेमाल कर सकते हैं:

string[] names = { "Jon", "Marc", "Joel", "Thomas", "Copsey", "Konrad", "Andrew", "Brian", "Bill" }; 
var result = names. AlphaLengthWise(a => a.Length); 
+0

मुझे लगता है कि मैं खुद को ढूंढता हूं जेनेरिक कोड के साथ इस 'lengthProvider' जैसी तकनीकों का उपयोग करना। यह सिर्फ एक और कारण है कि मैं लम्बादा से बहुत प्यार करता हूं। : डी –

-1

आप IEnumerable<T> बजाय T[] उपयोग करना चाहते हैं। इसके अलावा, आप LengthT का उपयोग करने में सक्षम नहीं होंगे, क्योंकि सभी प्रकारों में Length संपत्ति नहीं है। क्या आप जानते हैं कि आप हमेशा तार के साथ काम कर रहे होंगे, बल्कि IEnumerable<T> से IEnumerable<String> का उपयोग करते हैं आप .OrderBy(a => a.ToString().Length)

करने के लिए अपने विस्तार विधि को संशोधित कर सकता है, और आप तुरंत Length संपत्ति उपयोग करने में सक्षम हो जाएगा।

+0

बदलना टी [] IENumerable तत्वों के लिए लंबाई संपत्ति की मांग नहीं करेगा। –

+0

यह निश्चित रूप से नहीं होगा। उत्तर का वह हिस्सा दूसरी त्रुटि के संबंध में था। 'IOrderedEumerable ' लागू 'IENumerable ', ताकि समस्या के उस हिस्से को हल किया जा सके। 'लंबाई' संपत्ति के लिए, मेरा सुझाव था कि 'टूस्ट्रिंग()' का उपयोग स्ट्रिंग को सुनिश्चित करने के लिए किया गया था, या, यदि वह नया होता तो वह हमेशा' टी 'से' स्ट्रिंग 'को बदलने के लिए तारों से निपट रहा होता। –

14

आप इसे सामान्य रूप से क्यों करना चाहते हैं? बस

public static class ExtensionOperations 
{ 
    public static IEnumerable<string> AlphaLengthWise(this string[] names) 
    { 
     var query = names.OrderBy(a => a.Length).ThenBy(a => a); 
     return query; 
    } 
} 
+1

क्यों 'स्ट्रिंग [] 'और नहीं' IEnumerable '? आप '.ToArray()' को हटा सकते हैं और इसे स्थगित कर सकते हैं (यदि मुझे गलत नहीं है)। –

2

का उपयोग मैं एक सामान्य एक्सटेंशन विधि जो तार तो वर्णमाला में की व्यवस्था करनी चाहिए विकसित करना चाहते हैं ...

public static class ExtensionOperation 
{ 
    public static IEnumerable<String> AplhaLengthWise(
            this IEnumerable<String> names) 
    { 
     return names.OrderBy(a => a.Length).ThenBy(a => a); 
    } 
} 
3

क्यों आप इसे सामान्य हो करना चाहते हैं?

यह केवल तभी काम करेगा जब T की लंबाई संपत्ति होगी, और आपको इसे लागू करने के लिए एक इंटरफ़ेस की आवश्यकता होगी।

इसके अलावा टी को आईसीओपरपेबल होना चाहिए।

1

कॉपी कैसे माइक्रोसॉफ्ट यह करता है:

public static class ExtensionOperation { 
    // Handles anything queryable. 
    public static IOrderedQueryable<string> AlphaLengthWise(this IQueryable<string> names) { 
     return names.OrderBy(a => a.Length).ThenBy(a => a); 
    } 
    // Fallback method for non-queryable collections. 
    public static IOrderedEnumerable<string> AlphaLengthWise(this IEnumerable<string> names) { 
     return names.OrderBy(a => a.Length).ThenBy(a => a); 
    } 
} 
5

मैं तुम्हें जेनरिक के प्रयोजन के लिए थोड़ा भ्रमित हो सकता है लगता है।

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

आपकी समस्या किसी विशिष्ट प्रकार, string प्रकार पर काम करने के लिए डिज़ाइन की गई है। जेनेरिक एक समस्या को हल करने के लिए नहीं जा रहे हैं जिसमें एक विशिष्ट प्रकार शामिल है।

public static class ExtensionOperations 
{ 
    public static IEnumerable<string> AlphaLengthWise(
     this IEnumerable<string> names) 
    { 
     if(names == null) 
      throw new ArgumentNullException("names"); 

     return names.OrderBy(a => a.Length).ThenBy(a => a); 
    } 
} 

तर्क और वापसी प्रकार IEnumerable<string> यह एक गैर सामान्य विस्तार विधि है जो किसी भी प्रकार IEnumerable<string> को लागू करने के लिए आवेदन कर सकते हैं बनाता है बनाना:

तुम क्या चाहते एक सरल (गैर सामान्य) एक्सटेंशन विधि है। इसमें string[], List<string>, ICollection<string>, IQueryable<string> और कई अन्य शामिल होंगे।

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