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


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.