2013-01-14 35 views
5

मैं एक विधि में एक सी # सरणी का उप-सेट पास करना चाहता हूं। मुझे कोई परवाह नहीं है कि विधि डेटा को ओवरराइट करती है, इसलिए एक प्रतिलिपि बनाने से बचना चाहेंगे।सी # नकली टुकड़ा प्रतिलिपि

क्या ऐसा करने का कोई तरीका है?

धन्यवाद।

उत्तर

10

IEnumerable<T> या ArraySegment<T> लेने के लिए विधि बदलें।

फिर आप पास कर सकते हैं new ArraySegment<T>(array, 5, 2)

+0

आप के साथ 'Skip' /' 'Take' IEnumerable ' का एक उदाहरण जोड़ सकते हैं। –

+1

@StefanSteinegger: 'ArraySegment 'लागू' IENumerable ' – SLaks

+0

शानदार, धन्यवाद। – user1400716

1

Arrays आकार के द्वारा अपरिवर्तनीय हैं (यानी आप सरणी के आकार को नहीं बदल सकते हैं), ताकि आप मूल सरणी की एक घटाई गई प्रति पास कर सकें। विकल्प के रूप में आप दो इंडेक्स को मूल सरणी को विधि में पार कर सकते हैं और अतिरिक्त दो इंडेक्स के आधार पर काम कर सकते हैं ..

-2

आप Linq Funktion लेने के लिए और सरणी से के रूप में कई तत्वों ले उपयोग कर सकते हैं के रूप में आप

var yournewarray = youroldarray.Take(4).ToArray(); 
+3

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

+0

-1: ओपी विशेष रूप से पोस्ट किया गया वह _not_ एक प्रतिलिपि चाहता है। – Tom

2

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

मैंने जानबूझकर उत्परिवर्तनीय तरीकों को नहीं जोड़ा। यदि आप विशेष रूप से चाहते हैं, तो यह जोड़ना आसान है। यदि आप म्यूटेबल विधियां जोड़ते हैं तो आप IList को भी कार्यान्वित करना चाहेंगे।

public class Subset<T> : IReadOnlyList<T> 
{ 
    private IList<T> source; 
    private int startIndex; 
    private int endIndex; 
    public Subset(IList<T> source, int startIndex, int endIndex) 
    { 
     this.source = source; 
     this.startIndex = startIndex; 
     this.endIndex = endIndex; 
    } 

    public T this[int i] 
    { 
     get 
     { 
      if (startIndex + i >= endIndex) 
       throw new IndexOutOfRangeException(); 
      return source[startIndex + i]; 
     } 
    } 

    public int Count 
    { 
     get { return endIndex - startIndex; } 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return source.Skip(startIndex) 
      .Take(endIndex - startIndex) 
      .GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
}