2012-04-13 21 views
5

चलें कहना मैं एक सरणीक्या LINQ इंडेक्स पर काम करता है?

byte[] myarr = {1,4,3,4,1,2,1,2,4,3,1,4,2};  

myarr लंबाई 13 (0-12 सूचकांक) जो भी पूर्णांक [] वैल की लंबाई हो जाएगा का होगा।

int[] val = new int[13]; 

मैं अपनेarr की अनुक्रमणिका जांचना चाहता हूं जहां इसका मूल्य 4 iee 1,3,8,11 है।

तो मैं चाहता हूँ ऐसा करने का

val[1]++; 
val[3]++; 
val[8]++; 
val[11]++; 

एक तरह से पाश के लिए उपयोग कर रहा है

for(int i=0; i<myarr.length; i++) 
{ 
    if(myarr[i] == 4) 
     val[i]++; 
} 

हम Array.indexof उपयोग कर सकते हैं, लेकिन यह जिसका अर्थ है कि मूल्य नहीं है मूल्य के पहले सूचकांक रिटर्न अद्वितीय हो और मेरे myarr में बहुत सारे मूल्य हैं।

क्या यह linq का उपयोग करके किया जा सकता है?

int[] newIndices = myarr.Select((i, index) => new { Index = index, Value = i }) 
      .Where (x => x.Value == 4) 
      .Select(x => x.Index + 1) 
      .ToArray(); 

संपादित:

+5

आप LINQ के बारे में क्यों परवाह करेंगे? आप काम कर रहे उदाहरण पूरी तरह से सरल है। इसके अलावा, मुझे लगता है कि आप LINQ से प्राप्त कर सकते हैं कि सबसे अच्छा वास्तविक मूल्य होगा ... फिर भी आपको इसे बढ़ाना होगा और इसे वापस सरणी – musefan

+1

पर फिर से असाइन करना होगा LINQ में 'क्यू' क्वेरी के लिए खड़ा है। LINQ का प्रयोग * क्वेरीिंग * डेटा के लिए किया जाता है। आप * डेटा * बदलना चाहते हैं। लूप के लिए आपका यह तरीका है। –

+1

@ ग्राहमक्लर्क: LINC के लिए संभावित विचार? .... अंदर कौन है? – musefan

उत्तर

3

यह है कि मैं क्या LINQ में कर समाप्त हो गया (अद्यतन शामिल है) है:

myarr.Select((b, i) => b == 4 ? i : -1) 
    .Where(i => i != -1) 
    .ToList().ForEach(i => val[i]++); 

आपका गैर LINQ संस्करण जाहिर भी बहुत कुछ संक्षिप्त और पठनीय है, इसलिए मुझे लगता है कि आपको लगता है कि उपयोग करना चाहिए।

+0

यह 'के लिए होना चाहिए (i => वैल [i] ++)' मुझे लगता है .. –

+0

@PetrAbdulin यह सही है, मैंने कोड नमूना तय किया है। धन्यवाद! – GolfWolf

+0

@ w0lf: दो स्थानों में -1 स्थिति के साथ क्या है? –

1

आप index स्टोर करने के लिए एक anonymous type उपयोग कर सकते हैं अंत में मैं अपने प्रश्न समझ लिया है;,)

myarr.Select((i, index) => new { Index = index, Value = i }) 
       .Where(x => x.Value == 4) 
       .Select(x => x.Index) 
       .ForEach(i => myarr[i]++); 
+1

'वृद्धि' हिस्सा कहां है? –

+0

@ एलबी: बस उस हिस्से को पढ़ा, सही किया। –

+0

यह मौजूदा 'वैल' को संशोधित करने के बजाय नई सरणी बनाता है। –

2

आप कर सकते हैं, लेकिन यह नहीं होगा सरल होते हैं। LINQ केवल क्वेरी भाग के साथ आपकी सहायता करेगा, अद्यतन भाग को foo loop में किया जाना है, लेकिन चूंकि सरणी में मान प्रकार होते हैं, इसलिए आपको अपने LINQ-query से अनुक्रमणिका प्राप्त करने की आवश्यकता होती है, न कि वास्तविक मानों और आपने कुछ भी नहीं जीता है।

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