লিনকিউ ব্যবহার করে কোডের এক লাইনে স্ট্রিং [] ইনট্রে [] মধ্যে রূপান্তর করুন


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
শুধু এফওয়াইআই, আমি এই প্রশ্নটি এখানে ব্যবহার করছি: 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);

একটি লিনকিউ সমাধান একইরকম, আপনার ToArrayঅ্যারে পেতে অতিরিক্ত কল প্রয়োজন হবে তা বাদে :

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

4
খুশী হলাম। ওটা জানতাম না। +1 টি
খরচ করে

এই আইএল কোডটি উত্পন্ন করে আসলে সাইমন ফক্সের উত্তর, এফডাব্লুআইডাব্লু
অ্যালেন রাইস

80
আসলে, আপনার ল্যাম্বডা লাগবে না; ConvertAll(arr, int.Parse)যথেষ্ট
মার্ক Gravell

1
ভিবি.নেট 2010 এ ল্যাম্বডা প্রয়োজন: ইউআরএ = অ্যারে.কনভার্টএল (এসএনএমএস.স্প্লিট (","), ফাংশন (i) ইউআইঞ্জের.পারস (i))
বিসালিতা

1
@ বালিতা নো, ভিবি.নেট এটিতেArray.ConvertAll(arr, AddressOf Integer.Parse)
স্লাই

31

সম্পাদনা: অ্যারে রূপান্তর করতে

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

এই কৌতুক করতে হবে:

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

1
.ToArray () এর ওপির প্রশ্নটি পূরণ করতে হবে
ব্যয়কারী

2
ভার্ট ইন ইন্টিতে পরিবর্তন করুন [] এবং সংযোজন করুন। টুআররে () আপনার যদি প্রয়োজন হিসাবে এটির হিসাবে প্রয়োজন হয়
সাইমন ফক্স

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();

সি # 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 প্রদান করে ... এখানে সঠিক সমাধান কি?
বিটিটি

ধন্যবাদ @ বিটি। আমি কী নিয়ে ভাবছিলাম তা নিশ্চিত নয়। আমি এটিকে অন্য একটি বিকল্প দিয়ে প্রতিস্থাপন করেছি।
স্লেই

@ স্লাই: ধন্যবাদ কিন্তু কি করে new int[0]? যখন আমার পাঠ্য আছে, আমি 0আমার অ্যারেতে পাই না ...
বিটি

@ বিটিটি new int[0]একটি খালি ইন অ্যারে int প্রথম দুটি উদাহরণ যে মানগুলি পার্স করা যায় না তা এড়িয়ে যায় এবং শেষ দুটি উদাহরণ 0পার্স করা যায় না এমন মানগুলির জন্য ব্যবহার করে ।
স্লেই

@ স্লাই: আহ এখন আমি পেয়েছি আমি এটি মিশ্রিত new int[] {0}। ধন্যবাদ.
বিটিটি

12

আপনি কেবল ইন স্টারে একটি স্ট্রিং অ্যারে কাস্ট করতে পারেন:

var converted = arr.Select(int.Parse)

5
চমৎকার! ধন্যবাদ. এবং Dim converted = arr.Select(addressof Integer.Parse)
ভিবি.নেটে

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

আপনি অবশ্যই IEnumerable<int>রিটার্ন হিসাবে পাচ্ছেন না তা নিশ্চিত করতে হবে


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.