একটি তালিকা <int> কে কমা দ্বারা পৃথক করা স্ট্রিংয়ে রূপান্তর করা


116

একটি তালিকা নেওয়ার এবং এটিকে কমা দ্বারা পৃথক করা স্ট্রিংয়ে রূপান্তর করার কোনও উপায় আছে কি?

আমি জানি আমি কেবল এটি লুপ করতে পারি এবং এটি তৈরি করতে পারি তবে কোনওরকমভাবে আমি মনে করি আপনারা কিছু লোককে এটি করার আরও দুর্দান্ত উপায়?

আমি সত্যিই এই ধরণের 'কৌশলগুলি শিখতে চাই, সুতরাং দয়া করে আপনি যে পদ্ধতিটি ব্যবহার করেন তার ডক্সকে ব্যাখ্যা করুন বা লিঙ্ক করুন।

উত্তর:


189
List<int> list = ...;
string.Join(",", list.Select(n => n.ToString()).ToArray())

7
চতুর কিন্তু ধীর এবং স্ফীত, কারণ এটি উপাদান হিসাবে একটি স্ট্রিং বরাদ্দ করে। স্ট্রিংবিল্ডার ব্যবহার করা আরও বেশি দক্ষ হবে।
স্টিভেন সুদিত

3
আমি অনলাইনে যা দেখেছি (দ্রুত অনুসন্ধান) স্ট্রিং.জয়েন স্ট্রিংবিল্ডার ব্যবহার করার চেয়ে দ্রুত।
ইউরি ফক্টোরিভিচ


6
আমি মনে করি স্টিভেন স্ট্রিং.জয়িনের পরিবর্তে এন.টোস্ট্রিং () অংশটি উল্লেখ করছেন।
Larsenal

9
লার্সেনাল: তবে স্ট্রিংবিল্ডার। অ্যাপেন্ড (অন্তর্গত) অভ্যন্তরীণভাবে টোস্ট্রিংকে যে কোনওভাবে পূর্ণসংখ্যায় কল করে। স্ট্রিংবিল্ডার প্রতিটি উপাদানগুলির জন্য একটি স্ট্রিং বরাদ্দ করার ব্যয়টি যাদুকরীভাবে এড়ায় না; এটি এটিকে দৃষ্টিনন্দনভাবে সুন্দর করে তুলেছে।
itowlson

115

সহজ সমাধান

List<int> list = new List<int>() {1,2,3};
string.Join<int>(",", list)

আমি এটিকে এখনই আমার কোডটিতে ব্যবহার করেছি, দুর্দান্ত কাজ করছি।


1
ধন্যবাদ! এটি সুন্দর পদ্ধতির
ইরফান আশরাফ

2
এটি গ্রহণযোগ্য উত্তরটির পরে একটি আরও ভাল পদ্ধতির। এই পদ্ধতির সাথে আপনাকে লিনক আমদানি করতে হবে না এবং এটি দ্রুত।
জোকেরএক্সএক্সএলএএকেক

শান্ত! আমি কখনই স্ট্রিং জানতাম না oin জিনের জেনেরিক ওভারলোড থাকে। ধন্যবাদ।
শ্রীমশাল


6

এই সমস্যার সামান্য জটিল সংস্করণের প্রায় এক গাজিলিয়ান সমাধানের জন্য - যার অনেকগুলি ধীর, বগি, বা এমনকি সংকলন করে না - এই বিষয়ে আমার নিবন্ধটিতে মন্তব্যগুলি দেখুন:

http://blogs.msdn.com/ericlippert/archive/2009/04/15/comma-quibbling.aspx

এবং স্ট্যাকওভারফ্লো মন্তব্য:

এরিক লিপার্টের চ্যালেঞ্জ "কমা-কুইবলিং", সেরা উত্তর?


লিঙ্কের জন্য ধন্যবাদ। এই স্ট্রিং কনটেন্টেশন সমস্যাটি আমার প্রত্যাশার চেয়ে আরও জটিল এবং আরও শিক্ষামূলক হিসাবে প্রমাণিত হয়েছে!
স্টিভেন সুদিত

4

অতিরিক্ত শীতলতার জন্য আমি এইটিকে IEnumerable <T> এ একটি এক্সটেনশান পদ্ধতি তৈরি করব যাতে এটি যে কোনও আইনুনামেবলের উপর কাজ করে:

public static class IEnumerableExtensions {
  public static string BuildString<T>(this IEnumerable<T> self, string delim = ",") {
    return string.Join(delim, self)        
  }
}

এটি নিম্নলিখিত হিসাবে ব্যবহার করুন:

List<int> list = new List<int> { 1, 2, 3 };
Console.WriteLine(list.BuildString(", "));

দুটি সম্ভাব্য অপ্টিমাইজেশন: 1) নির্বিশেষে প্রতিটি আইটেমের পরে ডিলিমিটার যুক্ত করুন, তারপরে লুপ শেষ হওয়ার পরে অতিরিক্তটিকে সরিয়ে ফেলুন। 2) স্ট্রিংবিল্ডারের জন্য একটি ক্ষমতা নির্দিষ্ট করুন।
স্টিভেন সুদিত

1
আপনি যদি প্রতিচ্ছবিটি খনন করেন, তবে দেখা যাচ্ছে যে বাফারের আকারটি প্রাক্কলিত করার জন্য দৈর্ঘ্যের পরিমাণ যোগ করুন এবং লুপের বাইরে প্রথম স্ট্রিং যুক্ত করে "পাম্পগুলি" এবং তারপরে, লুপের অভ্যন্তরে, নিঃশর্তভাবে ডিলিমেটারটি যুক্ত করার পূর্বে পরবর্তী স্ট্রিং কিছু অনিরাপদ / অভ্যন্তরীণ কৌশলগুলির সাথে একত্রিত, এটি খুব দ্রুত হওয়া উচিত।
স্টিভেন সুদিত

@ স্টিভেন: আপনার পরামর্শ অনুসরণ করেছেন
সিডিগিংস

1
আপনি আপনার এক্সটেনশনে ডিলিমিটারটিকে হার্ডকোড করেছেন এবং একটি ডিলিমিটারের জন্য পাস করা মানটিকে উপেক্ষা করে সেমিকোলনটি মিস করেছেন। এটি হওয়া উচিতreturn string.Join(delim, self);
অ্যান্ড্রু

1

যৌক্তিকভাবে দ্রুত বলে মনে হচ্ছে।

IList<int> listItem = Enumerable.Range(0, 100000).ToList();
var result = listItem.Aggregate<int, StringBuilder, string>(new StringBuilder(), (strBuild, intVal) => { strBuild.Append(intVal); strBuild.Append(","); return strBuild; }, (strBuild) => strBuild.ToString(0, strBuild.Length - 1));

1

আমার "চালাক" এন্ট্রি:

        List<int> list = new List<int> { 1, 2, 3 };
        StringBuilder sb = new StringBuilder();
        var y = list.Skip(1).Aggregate(sb.Append(x.ToString()),
                    (sb1, x) =>  sb1.AppendFormat(",{0}",x));

        // A lot of mess to remove initial comma
        Console.WriteLine(y.ToString().Substring(1,y.Length - 1));

শর্তসাপেক্ষে কমা কীভাবে যুক্ত করা যায় তা ঠিক বুঝতে পারেন নি।


1
Selectল্যাম্বডায় পার্শ্ব প্রতিক্রিয়া সহ লিখবেন না দয়া করে । এক্ষেত্রে আপনি এমনকি ব্যবহার করছেন না y, সুতরাং আপনার Selectমূলত কেবল একটি foreach- তাই এটিকে লিখুন।
পাভেল মিনায়েভ

আমি এটি একটি ভাল সমাধান হিসাবে পরামর্শ দিচ্ছিলাম না। ওপি পূর্বাভাসের চেয়ে আরও আকর্ষণীয় কিছু চেয়েছিল।
লার্সনাল

হ্যাঁ, কিন্তু অপব্যবহারের Selectযেমন foreach"আকর্ষণীয়" অতীত ও মধ্যে, ভাল, "অপব্যবহার" যায়। একটি বেশি আকর্ষণীয় পদ্ধতির এখানে ব্যবহার করতে হবে Enumerable.Aggregateসঙ্গে StringBuilderযে চেষ্টা - একটি বীজ মান হিসাবে।
পাভেল মিনায়েভ

ভাল ধারণা. আমাকে বেরিয়ে যেতে হবে, তবে আমি এটিকে ঘূর্ণি দিতে পারি।
লার্সেনাল

0

আপনি ব্যবহার করতে পারেন, সিস্টেম.লিংক লাইব্রেরি; এটি আরও দক্ষ:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.