.NET- এ কোনও অক্ষর দ্বারা পৃথক স্ট্রিং-এ কীভাবে অন্তর্ভুক্ত হবে?


101

আমি পূর্ণসংখ্যার একটি অ্যারে আছে:

int[] number = new int[] { 2,3,6,7 };

এগুলিকে একক স্ট্রিংয়ে রূপান্তর করার সহজতম উপায়টি কী যেখানে সংখ্যাগুলি একটি অক্ষর দ্বারা পৃথক করা হয় (যেমন "2,3,6,7":)?

আমি সি # এবং .NET 3.5 এ আছি।


3
তাই পাথর! আমি রবিবার 10 মিনিটের মধ্যে এই 3 টি দুর্দান্ত উত্তর পেয়েছি!
রিরি

4
এর মধ্যে .NET 4.0এমন কিছু পদ্ধতি রয়েছে যা অবজেক্টগুলির একটি অ্যারে নেয় এবং একটি পরিসংখ্যানযোগ্য যাতে আপনি এটি করতে পারেন string.join(",", number)। আমি জানি।
জেসন গোয়েমাত

উত্তর:


162
var ints = new int[] {1, 2, 3, 4, 5};
var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());
Console.WriteLine(result); // prints "1,2,3,4,5"

সম্পাদনা : (কমপক্ষে) হিসাবে। নেট 4.5,

var result = string.Join(",", ints.Select(x => x.ToString()).ToArray());

সমান:

var result = string.Join(",", ints);

সম্পাদনা :

আমি বেশ কয়েকটি সমাধান দেখতে পাচ্ছি স্ট্রিংবিল্ডারের ব্যবহারের বিজ্ঞাপন। কেউ অভিযোগ করে যে যোগদানের পদ্ধতিটি একটি আইওনামেবল যুক্তি গ্রহণ করা উচিত।

আমি আপনাকে হতাশ করতে যাচ্ছি :) স্ট্রিং.জয়িনের একক কারণে - পারফরম্যান্সের জন্য অ্যারে প্রয়োজন। যোগদানের পদ্ধতির জন্য প্রয়োজনীয় পরিমাণ মেমরি কার্যকরভাবে বিকাশ করতে ডেটার আকার জানতে হবে to

এখানে স্ট্রিং.জাইন পদ্ধতির অভ্যন্তরীণ বাস্তবায়নের একটি অংশ রয়েছে:

// length computed from length of items in input array and length of separator
string str = FastAllocateString(length);
fixed (char* chRef = &str.m_firstChar) // note than we use direct memory access here
{
    UnSafeCharBuffer buffer = new UnSafeCharBuffer(chRef, length);
    buffer.AppendString(value[startIndex]);
    for (int j = startIndex + 1; j <= num2; j++)
    {
        buffer.AppendString(separator);
        buffer.AppendString(value[j]);
    }
}

প্রস্তাবিত পদ্ধতির পারফরম্যান্সের তুলনা করতে আমি খুব অলস। তবে কিছু আমাকে বলছে যে জয় জয় করবে :)


কোর। নেট এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে এটি সম্ভবত সেরা বাজি, তবে আমি সত্যিই স্ট্রিংটি চেয়েছিলাম Toজৌন () ToArray () রূপান্তর এড়ানোর জন্য একটি অনুমিত <স্ট্রিং> গ্রহণ করবে।
স্পোলসন

স্ট্রিংকে কাউকে ওভারলোডিং থেকে কোনও কিছুই আটকাতে পারে না IE পাশাপাশি একটি IENumerable নিতে যোগদান করুন। ;)
রবার্ট পি

1
এটি সম্ভবত সবচেয়ে সহজ সমাধান, এবং কেবল দ্রুত নয়।
ডেভ ভ্যান ডেন এয়েণ্ডে

9
.NET 4 একটি স্ট্রিং সরবরাহ করে oin এমএসডিএন.মাইক্রোসফট.এইন- ইউস
রায়ান কোহন

using System.Linq;দরকার.
গায়ান ওয়েরাকুট্টি

32

যদিও ওপ।

string.Join(",", Array.ConvertAll<int, String>(ints, Convert.ToString));

আমি দেখতে পাচ্ছি যে আরও অনেকগুলি ক্ষেত্রে রয়েছে যেখানে কনভার্ট.এক্সএক্সএক্সএক্স ফাংশনগুলির ব্যবহার ল্যাম্বডার একটি নিকটতম বিকল্প, যদিও সি # 3 এ ল্যাম্বদা টাইপ-ইনফারেন্সিংয়ে সহায়তা করতে পারে।

NET 2.0 এর সাথে কাজ করে এমন একটি মোটামুটি কমপ্যাক্ট সি # 3 সংস্করণ এটি:

string.Join(",", Array.ConvertAll(ints, item => item.ToString()))

11

দুটি পদ্ধতির একটি মিশ্রণ হ'ল আইইনুমেবল <T> যা একটি স্ট্রিংবিল্ডার ব্যবহার করেছে তাতে একটি এক্সটেনশন পদ্ধতি লিখতে হবে। আপনি রূপান্তর নির্দিষ্ট করতে চান বা কেবল প্লেইন টোস্ট্রিংয়ের উপর নির্ভর করতে চান তার উপর নির্ভর করে বিভিন্ন ওভারলোড সহ এখানে একটি উদাহরণ রয়েছে। অন্যান্য ধরণের যোগদানের সাথে বিভ্রান্তি এড়াতে আমি "যোগদান" এর পরিবর্তে পদ্ধতির নাম "জয়েনস্ট্রিংস" রেখেছি। সম্ভবত কেউ আরও ভাল নাম নিয়ে আসতে পারে :)

using System;
using System.Collections.Generic;
using System.Text;

public static class Extensions
{
    public static string JoinStrings<T>(this IEnumerable<T> source, 
                                        Func<T, string> projection, string separator)
    {
        StringBuilder builder = new StringBuilder();
        bool first = true;
        foreach (T element in source)
        {
            if (first)
            {
                first = false;
            }
            else
            {
                builder.Append(separator);
            }
            builder.Append(projection(element));
        }
        return builder.ToString();
    }

    public static string JoinStrings<T>(this IEnumerable<T> source, string separator)
    {
        return JoinStrings(source, t => t.ToString(), separator);
    }
}

class Test
{

    public static void Main()
    {
        int[] x = {1, 2, 3, 4, 5, 10, 11};

        Console.WriteLine(x.JoinStrings(";"));
        Console.WriteLine(x.JoinStrings(i => i.ToString("X"), ","));
    }
}

চমৎকার সমাধান! আপনার প্রজেকশন প্যারামিটারের দরকার নেই, তবে আপনি কেবল x.Select (i => i.ToString ("X")) লিখতে পারেন Join জয়েনস্ট্রিংস (";") যা আরও বুদ্ধিমান।
জ্যাকবিবি

হ্যাঁ, আমি পরে এটি সম্পর্কে ভেবেছিলাম। মাঝেমধ্যে এটা এক বারেই সব উল্লেখ পাবে চমৎকার, কিন্তু এটা স্পষ্টভাবে অপারেশন :) বিভক্ত করতে আরো মার্জিত এর
জন স্কিট

8
String.Join(";", number.Select(item => item.ToString()).ToArray());

আইটেমগুলির মধ্যে Stringযোগদানের আগে আমাদের প্রত্যেককে একটিতে রূপান্তর করতে হবে, যাতে এটি ব্যবহার করার জন্য Selectএবং ল্যাম্বডা ভাবটি বোঝায় । এটি mapঅন্য কয়েকটি ভাষায় সমান । তারপরে স্ট্রিংয়ের ফলাফলের সংগ্রহটিকে আবার অ্যারেতে রূপান্তর করতে হবে, কারণ String.Joinকেবল স্ট্রিং অ্যারে গ্রহণ করে।

ToArray()আমি মনে করি সামান্য কুশ্রী হয়। String.Joinসত্যই গ্রহণ করা উচিত IEnumerable<String>, এটি কেবল অ্যারেগুলিতে সীমাবদ্ধ করার কোনও কারণ নেই। এটি সম্ভবত Joinজেনারিকের আগে থেকেই ছিল, যখন অ্যারে কেবলমাত্র টাইপযুক্ত সংগ্রহই ছিল।


5

যদি আপনার পূর্ণসংখ্যার অ্যারে বড় হতে পারে তবে আপনি একটি স্ট্রিংবিল্ডার ব্যবহার করে আরও ভাল পারফরম্যান্স পাবেন। উদাহরণ:

StringBuilder builder = new StringBuilder();
char separator = ',';
foreach(int value in integerArray)
{
    if (builder.Length > 0) builder.Append(separator);
    builder.Append(value);
}
string result = builder.ToString();

সম্পাদনা: আমি যখন এটি পোস্ট করলাম তখন আমি এই ভুল ধারণাটির মধ্যে ছিলাম যে "স্ট্রিংবিল্ডার। অ্যাপেন্ড (ইনট মান)" অভ্যন্তরীণভাবে স্ট্রিং অবজেক্ট তৈরি না করে পূর্ণসংখ্যার মানটির স্ট্রিং প্রতিনিধিত্ব সংযোজন করতে সক্ষম হয়েছিল। এটি ভুল: প্রতিবিম্বকের সাথে পদ্ধতিটি পরীক্ষা করে দেখা যায় যে এটি কেবল মান সংযোজন করে। টুস্ট্রিং ()।

সুতরাং একমাত্র সম্ভাব্য পারফরম্যান্স পার্থক্য হ'ল এই কৌশলটি একটি অ্যারে সৃষ্টি এড়িয়ে যায় এবং জঞ্জাল সংগ্রহের জন্য স্ট্রিংগুলি কিছুটা শীঘ্রই মুক্ত করে। অনুশীলনে এটি কোনও পরিমাপযোগ্য পার্থক্য তৈরি করবে না, তাই আমি এই আরও ভাল সমাধানটি অগ্রাহ্য করেছি ।


আপনি এটি দ্রুত হতে পরিমাপ করেছেন? স্ট্রিং.জাইন একটি স্ট্রিংবিল্ডারও ব্যবহার করে।
জ্যাকবিবি

হ্যাঁ, তবে আপনাকে প্রথমে পুরো জিনিসটিকে একটি অ্যারেতে রূপান্তর করতে হবে যা আদর্শ থেকে অনেক দূরে। বিশেষত, এর অর্থ হ'ল ফলস্বরূপ স্ট্রিং তৈরির আগে আপনার একই সাথে সমস্ত রূপান্তরিত স্ট্রিং মেমরিতে থাকতে হবে in
জন স্কিটি

ওটিওএইচ স্ট্রিং.জয়াইন স্ট্রিংবিল্ডার বাফারের আকারের প্রাক্কলকুলেট করে যাতে এটি পুনরায় আকার এড়ায়। সুতরাং এটি আরও মেমরির প্রয়োজন হলেও এটি দ্রুত হতে পারে।
জ্যাকবিবি

5

প্রশ্নটি হ'ল "এগুলিকে একক স্ট্রিংয়ে রূপান্তর করার সবচেয়ে সহজ পদ্ধতির জন্য যেখানে সংখ্যাটি একটি অক্ষর দ্বারা পৃথক করা হয়"।

সবচেয়ে সহজ উপায়:

int[] numbers = new int[] { 2,3,6,7 };
string number_string = string.Join(",", numbers);
// do whatever you want with your exciting new number string

সম্পাদনা: এটি কেবল নেট নেট 4.0.০+ তে কাজ করে, আমি প্রথমবার প্রশ্নটি পড়ার জন্য নেট .৩.৩ প্রয়োজন বোধ করি।


এটি স্ট্রিং হিসাবে বৈধ নয় oinজৌন পদ্ধতিতে কেবল স্ট্রিংগুলির একটি অ্যারে লাগে। একবার দেখে এখানে msdn.microsoft.com/en-us/library/tk0xe5h0.aspx
ppolyzos

1
এটি একটি ওভারলোড পদ্ধতি হল: msdn.microsoft.com/en-us/library/dd988350 আমি শুধু কোড আমি একটি নতুন কনসোল অ্যাপ্লিকেশন মধ্যে লিখেছিলেন কপি, একটি Console.WriteLine জুড়েছে এবং এই আউটপুট হল: 2,3,6,7
ওয়েবমাস্টারপ

1
আমি মনে করি এটি কেবল নেট নেট 4 এ পাওয়া যাবে
গোবিন্দ মালভিয়া

একটি অবজেক্ট অ্যারে (বা স্ট্রিং অ্যারে) প্রয়োজন, কোনও ইনট অ্যারে নয়। একটি "কল অস্পষ্ট" ত্রুটি দেবে।
ল্যারিবুদ

2

আমি পঠনযোগ্যতা এবং রক্ষণাবেক্ষণের জন্য ল্যাম্বডা অভিব্যক্তির সাথে একমত, তবে এটি সর্বদা সেরা বিকল্প হবে না। আইইনিউমারেবল / টুআর্রে এবং স্ট্রিংবিল্ডার উভয় পদ্ধতিরই ব্যবহারের নেতিবাচক দিকটি হ'ল চূড়ান্ত স্ট্রিংয়ের জন্য কত জায়গার প্রয়োজন হবে তা তারা জানে না, কারণ তাদের আইটেম বা অক্ষরগুলির একটি তালিকা গতিশীলভাবে বৃদ্ধি করতে হবে।

বিরল ক্ষেত্রে যেখানে গতি সংক্ষিপ্ততার চেয়ে গুরুত্বপূর্ণ, নিম্নলিখিতটি আরও কার্যকর।

int[] number = new int[] { 1, 2, 3, 4, 5 };
string[] strings = new string[number.Length];
for (int i = 0; i < number.Length; i++)
  strings[i] = number[i].ToString();
string result = string.Join(",", strings);

2
ints.Aggregate("", ( str, n ) => str +","+ n ).Substring(1);

আমি আরও সহজ উপায় আছে ভেবেছি। পারফরম্যান্স সম্পর্কে জানেন না, কারও (তাত্ত্বিক) ধারণা আছে?


এই সমাধানটি আপনাকে ", 1,2,3,4,5" দেবে।
সারিন 8

ধন্যবাদ, আমি Substring(1)এটি সংশোধন করতে যোগ করেছি (এটি স্মৃতি থেকে ছিল)।
অকার্যকর

2

.NET 4.0 এ, স্ট্রিং জোনে এর জন্য একটি ওভারলোড থাকে params object[]তাই এটি এতটা সহজ:

int[] ids = new int[] { 1, 2, 3 };
string.Join(",", ids);

উদাহরণ

int[] ids = new int[] { 1, 2, 3 };
System.Data.Common.DbCommand cmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM some_table WHERE id_column IN (@bla)");
cmd.CommandText = cmd.CommandText.Replace("@bla",  string.Join(",", ids));

.NET 2.0 এ, এটি একটি সামান্য সামান্য আরও কঠিন, যেহেতু এ জাতীয় কোনও ওভারলোড নেই। সুতরাং আপনার নিজের জেনেরিক পদ্ধতিটি প্রয়োজন:

public static string JoinArray<T>(string separator, T[] inputTypeArray)
{
    string strRetValue = null;
    System.Collections.Generic.List<string> ls = new System.Collections.Generic.List<string>();

    for (int i = 0; i < inputTypeArray.Length; ++i)
    {
        string str = System.Convert.ToString(inputTypeArray[i], System.Globalization.CultureInfo.InvariantCulture);

        if (!string.IsNullOrEmpty(str))
        { 
            // SQL-Escape
            // if (typeof(T) == typeof(string))
            //    str = str.Replace("'", "''");

            ls.Add(str);
        } // End if (!string.IsNullOrEmpty(str))

    } // Next i 

    strRetValue= string.Join(separator, ls.ToArray());
    ls.Clear();
    ls = null;

    return strRetValue;
}

.NET 3.5 এ, আপনি এক্সটেনশন পদ্ধতিগুলি ব্যবহার করতে পারেন:

public static class ArrayEx
{

    public static string JoinArray<T>(this T[] inputTypeArray, string separator)
    {
        string strRetValue = null;
        System.Collections.Generic.List<string> ls = new System.Collections.Generic.List<string>();

        for (int i = 0; i < inputTypeArray.Length; ++i)
        {
            string str = System.Convert.ToString(inputTypeArray[i], System.Globalization.CultureInfo.InvariantCulture);

            if (!string.IsNullOrEmpty(str))
            { 
                // SQL-Escape
                // if (typeof(T) == typeof(string))
                //    str = str.Replace("'", "''");

                ls.Add(str);
            } // End if (!string.IsNullOrEmpty(str))

        } // Next i 

        strRetValue= string.Join(separator, ls.ToArray());
        ls.Clear();
        ls = null;

        return strRetValue;
    }

}

সুতরাং আপনি joinArray এক্সটেনশন-পদ্ধতিটি ব্যবহার করতে পারেন।

int[] ids = new int[] { 1, 2, 3 };
string strIdList = ids.JoinArray(",");

আপনি যদি নিজের কোডটিতে এক্সটেনশনঅ্যাট্রিবিউট যোগ করেন তবে আপনি .NET 2.0 এ সেই এক্সটেনশন পদ্ধতিটিও ব্যবহার করতে পারেন:

// you need this once (only), and it must be in this namespace
namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute {}
}

1

8
এর জন্য লিঙ্কযুক্ত পৃষ্ঠায় সংজ্ঞায়িত এক্সটেনশন পদ্ধতিটি দরকার, এটি আরও পরিষ্কার হতে পারে
স্টকস আর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.