LINQ का उपयोग करके कोड की एक पंक्ति में [[] को int [] में बदलें


273

मेरे पास स्ट्रिंग फॉर्म में पूर्णांकों की एक सरणी है:

var arr = new string[] { "1", "2", "3", "4" };

मुझे इसे आगे बढ़ाने के लिए 'वास्तविक' पूर्णांक की एक सरणी की आवश्यकता है:

void Foo(int[] arr) { .. }

मैंने इंट कास्ट करने की कोशिश की और यह निश्चित रूप से विफल रहा:

Foo(arr.Cast<int>.ToArray());

मैं आगे कर सकता हूं:

var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());

या

var list = new List<int>(arr.Length);
arr.ForEach(i =>
{
   int j;
   if (Int32.TryParse(i, out j)) // TryParse is faster, yeah
   {
      list.Add(j);
   }
 }
 Foo(list.ToArray());

लेकिन दोनों बदसूरत लग रहे हैं।

क्या कार्य को पूरा करने के लिए कोई अन्य तरीका है?


3
केवल एक संग्रह के माध्यम से पुनरावृत्ति करना, मूल्य को परिवर्तित करना और इसे दूसरे में जोड़ना क्या गलत है? मेरे लिए बहुत स्पष्ट लगता है।
एड एस।


1
सिर्फ FYI करें, मैं यहाँ इस प्रश्न का उपयोग कर रहा हूँ: stackoverflow.com/questions/1297325/…
एलन चावल


TryParse तेज़ नहीं है (सिवाय इसके कि यदि आपके तार अमान्य हैं, लेकिन उस स्थिति में आप अपवाद को आपको सचेत करना चाहते हैं)।
usr

जवाबों:


608

किसी सरणी को देखते हुए आप Array.ConvertAllविधि का उपयोग कर सकते हैं :

int[] myInts = Array.ConvertAll(arr, s => int.Parse(s));

मार्क ग्रेवेल को यह इंगित करने के लिए धन्यवाद कि लैम्ब्डा को छोड़ा जा सकता है, नीचे दिखाए गए एक छोटे संस्करण की उपज:

int[] myInts = Array.ConvertAll(arr, int.Parse);

एक LINQ समाधान समान है, इसके अलावा आपको ToArrayएक सरणी प्राप्त करने के लिए अतिरिक्त कॉल की आवश्यकता होगी:

int[] myInts = arr.Select(int.Parse).ToArray();

4
अच्छा लगा। उस एक को नहीं जानता था। +1
स्पेंडर

IL कोड यह उत्पन्न करता है, वास्तव में सिमोन फॉक्स के उत्तर से कम है, FWIW
एलन राइस

80
दरअसल, आपको लंबोदर की जरूरत नहीं है; ConvertAll(arr, int.Parse)पर्याप्त है
मार्क Gravell

1
VB.Net 2010 में लैम्ब्डा की जरूरत है: uArray = Array.ConvertAll (sNums.Split (","), फ़ंक्शन (i) UInteger.Parse (i))
BSalita

1
@BSalita नहीं, VB.Net में यहArray.ConvertAll(arr, AddressOf Integer.Parse)
18

31

संपादित करें: सरणी में बदलने के लिए

int[] asIntegers = arr.Select(s => int.Parse(s)).ToArray();

यह काम कर जाना चाहिए:

var asIntegers = arr.Select(s => int.Parse(s));

1
.ToArray () ओपी के प्रश्न को पूरा करने के लिए आवश्यक है
खर्च करें

2
परिवर्तन को int में बदलें [] और जोड़ें .ToArray () यदि आपको एक अंतर सरणी के रूप में इसकी आवश्यकता है
शमौन फॉक्स

19

अपवादों से बचने के लिए .Parse, यहां कुछ .TryParseविकल्प दिए गए हैं।

केवल उन तत्वों का उपयोग करने के लिए जिन्हें पार्स किया जा सकता है:

string[] arr = { null, " ", " 1 ", " 002 ", "3.0" };
int i = 0; 
var a = (from s in arr where int.TryParse(s, out i) select i).ToArray();  // a = { 1, 2 }

या

var a = arr.SelectMany(s => int.TryParse(s, out i) ? new[] { i } : new int[0]).ToArray();

0उन तत्वों का उपयोग करने वाले विकल्प जिन्हें पार्स नहीं किया जा सकता है:

int i; 
var a = Array.ConvertAll(arr, s => int.TryParse(s, out i) ? i : 0); //a = { 0, 0, 1, 2, 0 }

या

var a = arr.Select((s, i) => int.TryParse(s, out i) ? i : 0).ToArray();

C # 7.0 :

var a = Array.ConvertAll(arr, s => int.TryParse(s, out var i) ? i : 0);

दूसरा समाधान: var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();केवल वास्तविक मानों के बजाय, 0,1,2, ... लौटाता है। यहाँ सही समाधान क्या है?
बीईटी जूल

साभार @Beetee निश्चित नहीं कि मैं उसके साथ क्या सोच रहा था। मैंने इसे दूसरे विकल्प से बदल दिया।
स्लैई

@ शलाई: धन्यवाद। लेकिन क्या करता है new int[0]? जब मेरे पास पाठ होता है, मुझे 0मेरे एरे में नहीं मिलता है ...
बीती

@ बीटीई new int[0]एक खाली इंट सरणी है। पहले दो उदाहरण उन मानों को छोड़ देते हैं जिन्हें पार्स नहीं किया जा सकता है, और अंतिम दो उदाहरण 0उन मानों के लिए उपयोग करते हैं जिन्हें पार्स नहीं किया जा सकता है।
स्लैई

@ शलाई: आह अब मैं समझ गया। मैंने उसे मिलाया new int[] {0}। धन्यवाद।
बीट्ली

12

आप बस एक स्ट्रिंग सरणी को int सरणी में डाल सकते हैं:

var converted = arr.Select(int.Parse)

5
अच्छा! धन्यवाद। और VB.Net मेंDim converted = arr.Select(addressof Integer.Parse)
मफु जोश

3
var asIntegers = arr.Select(s => int.Parse(s)).ToArray(); 

सुनिश्चित करें कि आपको IEnumerable<int>रिटर्न के रूप में नहीं मिल रहा है


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.