আইলিস্ট <স্ট্রিং> বা আইনিউবারেবল <স্ট্রিং> থেকে কমা বিভাজিত তালিকা তৈরি করা


848

একটি IList<string>বা থেকে স্ট্রিং মানগুলির সাথে কমা-বিচ্ছিন্ন তালিকা তৈরির সবচেয়ে সহজ উপায় কী IEnumerable<string>?

String.Join(...)একটি করে পরিচালিত string[]সুতরাং যখন যেমন ধরনের সঙ্গে কাজ করার কষ্টকর হতে পারে IList<string>বা IEnumerable<string>সহজে একটি স্ট্রিং অ্যারে রূপান্তরিত করা যাবে না।


5
ওহ ... উফ! আমি 3.5 এ public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
টোআরাই

1
আপনি যদি এই প্রশ্নে সিএসভি লেখার কোনও মাধ্যমের সন্ধান করে চলে এসেছেন তবে এটি মনে রাখা উচিত যে আইটেমগুলির মধ্যে কেবল কমা সন্নিবেশ করা অপর্যাপ্ত এবং উত্সের ডেটাতে কোট এবং কমা ক্ষেত্রে ব্যর্থতা সৃষ্টি করবে।
খরচ

উত্তর:


1446

.NET 4+

IList<string> strings = new List<string>{"1","2","testing"};
string joined = string.Join(",", strings);

বিশদ এবং প্রাক। নেট 4.0 সমাধান

IEnumerable<string>লিনকিউ (.NET 3.5) এর সাহায্যে খুব সহজেই স্ট্রিং অ্যারেতে রূপান্তর করা যায়:

IEnumerable<string> strings = ...;
string[] array = strings.ToArray();

আপনার যদি প্রয়োজন হয় তবে সমতুল্য সহায়ক পদ্ধতি লিখতে যথেষ্ট সহজ:

public static T[] ToArray(IEnumerable<T> source)
{
    return new List<T>(source).ToArray();
}

তারপরে এটিকে কল করুন:

IEnumerable<string> strings = ...;
string[] array = Helpers.ToArray(strings);

তারপরে আপনি কল করতে পারেন string.Join। অবশ্যই, আপনি না আছে একটি সাহায্যকারী পদ্ধতি ব্যবহার করার জন্য:

// C# 3 and .NET 3.5 way:
string joined = string.Join(",", strings.ToArray());
// C# 2 and .NET 2.0 way:
string joined = string.Join(",", new List<string>(strings).ToArray());

পরেরটি কিছুটা মুখখানি যদিও :)

এটি পুরোপুরি performant পাশাপাশি এটা করতে সবচেয়ে সহজ উপায় হতে পারে, এবং - প্রায় অন্য কোন প্রশ্ন আছে ঠিক কি কর্মক্ষমতা মত সহ (কিন্তু সীমাবদ্ধ নয়) এই এক

.NET 4.0 হিসাবে, আরও বেশি ওভারলোড উপলব্ধ রয়েছে string.Join, তাই আপনি আসলে লিখতে পারেন:

string joined = string.Join(",", strings);

অনেক সহজ :)


সহায়ক পদ্ধতির মধ্যে দুটি অপ্রয়োজনীয় তালিকা তৈরি করা জড়িত। সমস্যাটি সমাধানের এটি কি সর্বোত্তম উপায়? এটিকে কেন নিজেকে পূর্ববর্তী লুপে সংযুক্ত করবেন না?
এরিক

4
সহায়ক পদ্ধতিটি কেবল একটি তালিকা এবং একটি অ্যারে তৈরি করে । মুল বক্তব্যটি হল ফলাফলটি অ্যারে হওয়া দরকার, তালিকা নয় ... এবং শুরু করার আগে আপনাকে অ্যারের আকার জানতে হবে। সেরা অনুশীলন বলছে আপনাকে লিনকিউতে একাধিকবার কোনও উত্স গণনা করা উচিত নয় - এটি সমস্ত ধরণের বাজে জিনিস করতে পারে। সুতরাং, আপনি বাফারগুলিতে পড়া এবং পুনরায় আকার দেওয়ার সাথে সাথেই চলে যাচ্ছেন - যা ঠিক তাই List<T>হয়। চাকা পুনরুদ্ধার কেন?
জন স্কিটি

9
না, মুল বক্তব্যটি হল ফলাফলটি একটি সংক্ষিপ্ত স্ট্রিং হওয়া দরকার। এই লক্ষ্য অর্জনের জন্য নতুন তালিকা বা নতুন অ্যারে তৈরি করার দরকার নেই। এই জাতীয়। নেট মানসিকতা আমাকে দুঃখিত করে তোলে।
এরিক

38
এটাই. প্রতিটি উত্তর জন স্কিকেট বাড়ে। আমি কেবল কিনে যাচ্ছি PurchaseBooks = AmazonContainer.Where (p => p.Author == "জন স্কিটি") নির্বাচন করুন ();
জ্যাকারি স্কট

3
@ কোডমনকি0১১০: ওয়েল, সেখানে কোনও ক্যোয়ারী এক্সপ্রেশন থাকা বা কল করা কোনও লাভ নেই ToListstring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))যদিও এটি ব্যবহার ভাল ।
জন স্কিটি

179

এফওয়াইআই, .NET 4.0 সংস্করণটিতে string.Join()কিছু অতিরিক্ত ওভারলোড রয়েছে যা IEnumerableকেবলমাত্র অ্যারে পরিবর্তে কাজ করে যা কোনও ধরণের সাথে ডিল করতে পারে T:

public static string Join(string separator, IEnumerable<string> values)
public static string Join<T>(string separator, IEnumerable<T> values)

2
এটি কি টি.স্টোস্ট্রিং () পদ্ধতিতে কল করবে?
ফিলিপ লাভোই

জনের উত্তর সম্পর্কে এই সম্পর্কে মন্তব্য করতে চলেছিলাম। উল্লেখ করার জন্য ধন্যবাদ।
ড্যান বেচার্ড

2
যাইহোক কোনও বস্তুর সম্পত্তিতে এটি করতে? (উদা: উদাহরণস্বরূপ <এমপ্লয়ী> এবং কর্মচারী বস্তুর একটি স্ট্রিং SS এসএসএন সম্পত্তি রয়েছে এবং এসএসএন এর একটি কমা দ্বারা পৃথক তালিকা
পেয়েছে

1
আপনাকে প্রথমে স্ট্রিংটি নির্বাচন করতে হবে, যদিও আপনি এটির কোনও এক্সটেনশন পদ্ধতি তৈরি করতে পারেন। str = emps.Select(e => e.SSN).Join(",")
জাভিয়ার পইনাস

65

এটি করার সবচেয়ে সহজ উপায়টি আমি লিনকিউ Aggregateপদ্ধতিটি ব্যবহার করে দেখছি :

string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)

20
এটি কেবলমাত্র টোআর্যা + যোগ দেওয়ার চেয়ে জটিল (আইএমও) নয়, এটি কিছুটা অক্ষমও রয়েছে - একটি বড় ইনপুট ক্রম সহ, এটি খুব খারাপভাবে সম্পাদন শুরু করতে চলেছে।
জন স্কিটি 19

35
তবুও, এটি সবচেয়ে সুন্দর।
মেরিট

2
আপনি সামগ্রিক একটি স্ট্রিংবিল্ডার বীজ খাওয়াতে পারেন, তারপরে আপনার সমষ্টিগত ফানক হয়ে যায় Func<StringBuilder,string,StringBuider>। তারপরে কেবল ToString()ফিরে আসা স্ট্রিংবিল্ডারকে কল করুন। এটি অবশ্যই তেমন সুন্দর নয় :)
ম্যাট গ্রেয়ার

3
এই প্রশ্নটি আইএমএইচও-র জন্য জিজ্ঞাসা করে যা করার স্পষ্টতম উপায়।
ডেরেক মরিসন

8
input.Count1 এর বেশি হওয়া উচিত এর থেকে সাবধান থাকুন
ইয়ংজা

31

আমি মনে করি স্ট্রিং মানগুলির সাথে কমা-বিচ্ছিন্ন তালিকা তৈরির সবচেয়ে সহজ উপায় হ'ল:

string.Join<string>(",", stringEnumerable);

এখানে একটি সম্পূর্ণ উদাহরণ:

IEnumerable<string> stringEnumerable= new List<string>();
stringList.Add("Comma");
stringList.Add("Separated");

string.Join<string>(",", stringEnumerable);

কোনও সহায়ক ফাংশন তৈরি করার দরকার নেই, এটি নেট নেট এবং তার উপরের 4.0


4
নোট 4 (জ্যাভিয়ার তার উত্তরে উল্লেখ করেছেন) দিয়ে এটি প্রযোজ্য তা নোট করুন।
ডেরেক মরিসন


13

পারফরম্যান্সের সাথে বিজয়ীর তুলনা করা হ'ল "এটিকে লুপ করুন, এসবি করুন end এটি প্রয়োগ করুন এবং পিছনে পদক্ষেপ করুন"। প্রকৃতপক্ষে "পরবর্তী গণনার এবং ম্যানুয়াল পদক্ষেপ" একই ভাল (স্টাডিডিভ বিবেচনা করুন)।

BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC
  [Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Clr    : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
  Core   : .NET Core 4.6.25009.03, 64bit RyuJIT


                Method |  Job | Runtime |     Mean |     Error |    StdDev |      Min |      Max |   Median | Rank |  Gen 0 | Allocated |
---------------------- |----- |-------- |---------:|----------:|----------:|---------:|---------:|---------:|-----:|-------:|----------:|
            StringJoin |  Clr |     Clr | 28.24 us | 0.4381 us | 0.3659 us | 27.68 us | 29.10 us | 28.21 us |    8 | 4.9969 |   16.3 kB |
 SeparatorSubstitution |  Clr |     Clr | 17.90 us | 0.2900 us | 0.2712 us | 17.55 us | 18.37 us | 17.80 us |    6 | 4.9296 |  16.27 kB |
     SeparatorStepBack |  Clr |     Clr | 16.81 us | 0.1289 us | 0.1206 us | 16.64 us | 17.05 us | 16.81 us |    2 | 4.9459 |  16.27 kB |
            Enumerable |  Clr |     Clr | 17.27 us | 0.0736 us | 0.0615 us | 17.17 us | 17.36 us | 17.29 us |    4 | 4.9377 |  16.27 kB |
            StringJoin | Core |    Core | 27.51 us | 0.5340 us | 0.4995 us | 26.80 us | 28.25 us | 27.51 us |    7 | 5.0296 |  16.26 kB |
 SeparatorSubstitution | Core |    Core | 17.37 us | 0.1664 us | 0.1557 us | 17.15 us | 17.68 us | 17.39 us |    5 | 4.9622 |  16.22 kB |
     SeparatorStepBack | Core |    Core | 15.65 us | 0.1545 us | 0.1290 us | 15.45 us | 15.82 us | 15.66 us |    1 | 4.9622 |  16.22 kB |
            Enumerable | Core |    Core | 17.00 us | 0.0905 us | 0.0654 us | 16.93 us | 17.12 us | 16.98 us |    3 | 4.9622 |  16.22 kB |

কোড:

public class BenchmarkStringUnion
{
    List<string> testData = new List<string>();
    public BenchmarkStringUnion()
    {
        for(int i=0;i<1000;i++)
        {
            testData.Add(i.ToString());
        }
    }
    [Benchmark]
    public string StringJoin()
    {
        var text = string.Join<string>(",", testData);
        return text;
    }
    [Benchmark]
    public string SeparatorSubstitution()
    {
        var sb = new StringBuilder();
        var separator = String.Empty;
        foreach (var value in testData)
        {
            sb.Append(separator).Append(value);
            separator = ",";
        }
        return sb.ToString();
    }

    [Benchmark]
    public string SeparatorStepBack()
    {
        var sb = new StringBuilder();
        foreach (var item in testData)
            sb.Append(item).Append(',');
        if (sb.Length>=1) 
            sb.Length--;
        return sb.ToString();
    }

    [Benchmark]
    public string Enumerable()
    {
        var sb = new StringBuilder();
        var e = testData.GetEnumerator();
        bool  moveNext = e.MoveNext();
        while (moveNext)
        {
            sb.Append(e.Current);
            moveNext = e.MoveNext();
            if (moveNext) 
                sb.Append(",");
        }
        return sb.ToString();
    }
}

https://github.com/dotnet/BenchmarkDotNet ব্যবহার করা হয়েছিল


11

যেহেতু আমি এখানে পৌঁছেছি অবজেক্টের তালিকার একটি নির্দিষ্ট সম্পত্তিতে যোগ দেওয়ার জন্য অনুসন্ধান করতে গিয়ে (এবং এর টুস্ট্রিং () নয়) এখানে গ্রহণযোগ্য উত্তরের একটি সংযোজন রয়েছে:

var commaDelimited = string.Join(",", students.Where(i => i.Category == studentCategory)
                                 .Select(i => i.FirstName));


8

এই আলোচনায় কিছুটা দেরি করে পৌঁছেছি তবে এটি আমার অবদান wi আমার IList<Guid> OrderIdsএকটি সিএসভি স্ট্রিংয়ে রূপান্তরিত হতে হবে তবে নিম্নলিখিতটি জেনেরিক এবং অন্যান্য ধরণের সাথে অপরিবর্তিত কাজ করে:

string csv = OrderIds.Aggregate(new StringBuilder(),
             (sb, v) => sb.Append(v).Append(","),
             sb => {if (0 < sb.Length) sb.Length--; return sb.ToString();});

সংক্ষিপ্ত এবং মিষ্টি, নতুন স্ট্রিং তৈরির জন্য স্ট্রিংবিল্ডার ব্যবহার করে, শেষ কমাটি অপসারণের জন্য স্ট্রিংবিল্ডারের দৈর্ঘ্য একটিকে সঙ্কুচিত করে এবং CSV স্ট্রিং প্রদান করে।

আমি Append()স্ট্রিং + কমা যোগ করতে একাধিকের ব্যবহার করতে এটি আপডেট করেছি । জেমস 'প্রতিক্রিয়া থেকে আমি প্রতিফলক ব্যবহার কটাক্ষপাত আছে StringBuilder.AppendFormat()। দেখা যাচ্ছে AppendFormat()যে ফর্ম্যাট স্ট্রিংটি নির্মাণের জন্য একটি স্ট্রিংবিল্ডার ব্যবহার করে যা একাধিকের ব্যবহার না করে এই প্রসঙ্গে এটি কম দক্ষ করে তোলে Appends()


গ্যাজ্প্পড, ধন্যবাদ জাভিয়ার আমি। নেট 4-এ সেই আপডেট সম্পর্কে অবগত ছিলাম না। আমি যে প্রকল্পে কাজ করছি তা এখনও লাফিয়ে উঠেনি তাই আমি এর মধ্যে আমার পথচারীর উদাহরণটি ব্যবহার করব।
ডেভিড ক্লার্ক

2
এটি একটি শূন্য-আইটেমের মূল সংখ্যা সহ ব্যর্থ হবে। sb.Length-- একটি সীমানা চেক প্রয়োজন।
জেমস ডান

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

@ জেমস আমি ভাবি sb.Length- কল করতে একটি হ্যাক কিছুটা কঠোর। কার্যকরভাবে আমি প্রতিটি পুনরাবৃত্তিতে এটি করার চেয়ে শেষ পর্যন্ত আপনার "যদি (notdone)" পরীক্ষা এড়িয়ে চলেছি।
ডেভিড ক্লার্ক

1
@ জেমস আমার বক্তব্যটি এখানে প্রায়শই জিজ্ঞাসিত প্রশ্নগুলির একাধিক সঠিক উত্তর থাকে এবং একটিকে "হ্যাক" হিসাবে উল্লেখ করলে বোঝা যায় যে এটি ভুল যা আমি বিতর্ক করব। উপরের অল্প সংখ্যক গাইডের জন্য আমি উপরের ড্যানিয়েলের উত্তরটি সম্ভবত পুরোপুরি পর্যাপ্ত হতে পারে এবং এটি আমার উত্তর পরে অবশ্যই আরও সংক্ষিপ্ত / পঠনযোগ্য। আমি আমার কোডটিতে এটি কেবলমাত্র এক জায়গায় ব্যবহার করছি এবং আমি কেবলমাত্র একটি সীমানা হিসাবে একটি কমা ব্যবহার করব। YAGNI বলে যে এমন কিছু তৈরি করবেন না যা আপনার প্রয়োজন হয় না। ডিআরওয়াই প্রযোজ্য যদি আমার একাধিকবার এটির প্রয়োজন হয় তবে আমি কোন পেনশন পদ্ধতি তৈরি করব। আছে HTH।
ডেভিড ক্লার্ক

7

কিছুটা পলকভাবে, তবে এটি কাজ করে:

string divisionsCSV = String.Join(",", ((List<IDivisionView>)divisions).ConvertAll<string>(d => d.DivisionID.ToString("b")).ToArray());

আপনি রূপান্তরকারীকে দেওয়ার পরে আপনাকে একটি তালিকা থেকে একটি সিএসভি দেয় (এই ক্ষেত্রে ডি => ডি। ডিভিশনআইডি Tটোস্ট্রিং ("বি"))।

হ্যাকি কিন্তু কাজ করে - সম্ভবত কোনও এক্সটেনশন পদ্ধতিতে তৈরি করা যেতে পারে?


7

অন্যান্য ভাষায় আমি যেভাবে করেছি তা এখানে ব্যবহার করে এখানে করেছি:

private string ToStringList<T>(IEnumerable<T> list, string delimiter)
{
  var sb = new StringBuilder();
  string separator = String.Empty;
  foreach (T value in list)
  {
    sb.Append(separator).Append(value);
    separator = delimiter;
  }
  return sb.ToString();
}

7

নির্দিষ্ট প্রয়োজন যখন আমাদের চারপাশে থাকা উচিত 'প্রাক্তন:

        string[] arr = { "jj", "laa", "123" };
        List<string> myList = arr.ToList();

        // 'jj', 'laa', '123'
        Console.WriteLine(string.Join(", ",
            myList.ConvertAll(m =>
                string.Format("'{0}'", m)).ToArray()));

4

আমাদের একটি ইউটিলিটি ফাংশন রয়েছে, এরকম কিছু:

public static string Join<T>( string delimiter, 
    IEnumerable<T> collection, Func<T, string> convert )
{
    return string.Join( delimiter, 
        collection.Select( convert ).ToArray() );
}

যা সহজেই প্রচুর সংগ্রহে যোগদানের জন্য ব্যবহার করা যেতে পারে:

int[] ids = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233};

string csv = StringUtility.Join(",", ids, i => i.ToString() );

নোট করুন যে ল্যাম্বদার আগে আমাদের কাছে সংগ্রহের পরম রয়েছে কারণ ইন্টেলিজেন্স তার পরে সংগ্রহের ধরণটি তুলে নেয়।

আপনার যদি ইতিমধ্যে স্ট্রিংয়ের একটি অঙ্ক আছে তবে আপনাকে যা করতে হবে তা হ'ল টুআরে:

string csv = string.Join( ",", myStrings.ToArray() );

2
: আমি একটি এক্সটেনশন পদ্ধতি যা প্রায় হুবহু একই জিনিস খুব দরকারী করে, আছে stackoverflow.com/questions/696850/...
LukeH

হ্যাঁ, আপনি এটি সহজেই যথেষ্ট হিসাবে টোডিলিমিটেড স্ট্রিং এক্সটেনশন পদ্ধতি হিসাবে লিখতে পারেন। আমি আমার একক লাইনের স্ট্রিং নিয়ে যাব St স্ট্রিংবিল্ডারকে শেষের চরটি ছাঁটাবার পরিবর্তে একটিতে যোগ দিন।
কিথ

3

আপনি IList কে ToArray ব্যবহার করে একটি অ্যারেতে রূপান্তর করতে পারেন এবং তারপরে অ্যারেতে একটি string.join কমান্ড চালাতে পারেন।

Dim strs As New List(Of String)
Dim arr As Array
arr = strs.ToArray

3

.NET 3.5 তে লিনক এক্সটেনশানগুলি ব্যবহার করে এগুলিকে সহজেই একটি অ্যারেতে রূপান্তর করা যায়।

   var stringArray = stringList.ToArray();

3

আপনি অন্যদের দ্বারা তালিকাবদ্ধ পদ্ধতিগুলির মধ্যে একটির ব্যবহার করে এটিকে অ্যারেতে রূপান্তরিত করার পরে আপনি নীচের মতো কিছু ব্যবহার করতে পারেন:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Configuration;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            CommaDelimitedStringCollection commaStr = new CommaDelimitedStringCollection();
            string[] itemList = { "Test1", "Test2", "Test3" };
            commaStr.AddRange(itemList);
            Console.WriteLine(commaStr.ToString()); //Outputs Test1,Test2,Test3
            Console.ReadLine();
        }
    }
}

সম্পাদনা: এখানে অন্য একটি উদাহরণ


3

আমি এই নিবন্ধটি জুড়ে হওয়ার আগে এই সমস্যাটি সমাধান করেছি। আমার সমাধান নীচের মত কিছু যায়:

   private static string GetSeparator<T>(IList<T> list, T item)
   {
       return (list.IndexOf(item) == list.Count - 1) ? "" : ", ";
   }

যেমন বলা হয়:

List<thing> myThings;
string tidyString;

foreach (var thing in myThings)
{
     tidyString += string.format("Thing {0} is a {1}", thing.id, thing.name) + GetSeparator(myThings, thing);
}

আমিও ঠিক তেমন সহজে প্রকাশ করতে পারতাম এবং আরও দক্ষ হয়ে উঠতাম:

string.Join(“,”, myThings.Select(t => string.format(“Thing {0} is a {1}”, t.id, t.name)); 

3

আমার উত্তরটি সমষ্টিগত সমাধানের মতো but

public static string ToCommaDelimitedString<T>(this IEnumerable<T> items)
{
    StringBuilder sb = new StringBuilder();
    foreach (var item in items)
    {
        sb.Append(item.ToString());
        sb.Append(',');
    }
    if (sb.Length >= 1) sb.Length--;
    return sb.ToString();
}

অবশ্যই, কেউ স্বাক্ষরকে সীমানা-স্বতন্ত্র করতে প্রসারিত করতে পারে। আমি সত্যই এসবি.আরমোভ () কলের অনুরাগী নই এবং কমা লিখতে হবে কি না তা নির্ধারণের জন্য আমি এটিকে আইকনামারেবলের উপর সোজা-লুপ হিসাবে চালিত করতে চাই এবং মুভনেক্সট () ব্যবহার করতে চাই। আমি আশেপাশে ঝাঁকুনি করব এবং আমি যদি সমাধানটি নিয়ে আসি তবে পোস্ট করব।


আমি প্রথমে যা চাইছিলাম তা এখানে:

public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> converter)
{
    StringBuilder sb = new StringBuilder();
    var en = source.GetEnumerator();
    bool notdone = en.MoveNext();
    while (notdone)
    {
        sb.Append(converter(en.Current));
        notdone = en.MoveNext();
        if (notdone) sb.Append(delimiter);
    }
    return sb.ToString();
}

কোনও অস্থায়ী অ্যারে বা তালিকা সঞ্চয়স্থান প্রয়োজন নেই এবং কোনও StringBuilder Remove()বা Length--হ্যাকের প্রয়োজন নেই।

আমার ফ্রেমওয়ার্ক গ্রন্থাগার আমি এই পদ্ধতি স্বাক্ষর কয়েক বৈচিত্র সহ প্রতিটি সমন্বয় তৈরি delimiterএবং converterব্যবহারের সঙ্গে পরামিতি ","এবং x.ToString()যথাক্রমে অক্ষমতা হিসেবে।



3

মাইএসকিএল পদ্ধতিতে সম্পন্ন স্ট্রিংগুলিতে যুক্ত হওয়ার জন্য একটি ভাল সি # পদ্ধতি অনুসন্ধান করার সময় আমি এই আলোচনার মুখোমুখি হয়েছি CONCAT_WS()। এই পদ্ধতিটি পদ্ধতির থেকে পৃথক string.Join()যে স্ট্রিংগুলি নাল বা খালি থাকলে এটি বিভাজনকারী চিহ্নটি যুক্ত করে না।

CONCAT_WS (',', tbl. শেষ নাম, tbl. প্রথম নাম)

Lastnameপ্রথম নামটি খালি থাকলেই কেবল ফিরে আসবে il

স্ট্রিং.জউইন (",", স্ট্রাস্টস্টনেম, স্ট্রফারস্টনেম)

strLastname + ", "একই ক্ষেত্রে ফিরে আসবে ।

প্রথম আচরণটি চেয়ে আমি নিম্নলিখিত পদ্ধতিগুলি লিখেছিলাম:

    public static string JoinStringsIfNotNullOrEmpty(string strSeparator, string strA, string strB, string strC = "")
    {
        return JoinStringsIfNotNullOrEmpty(strSeparator, new[] {strA, strB, strC});
    }

    public static string JoinStringsIfNotNullOrEmpty(string strSeparator, string[] arrayStrings)
    {
        if (strSeparator == null)
            strSeparator = "";
        if (arrayStrings == null)
            return "";
        string strRetVal = arrayStrings.Where(str => !string.IsNullOrEmpty(str)).Aggregate("", (current, str) => current + (str + strSeparator));
        int trimEndStartIndex = strRetVal.Length - strSeparator.Length;
        if (trimEndStartIndex>0)
            strRetVal = strRetVal.Remove(trimEndStartIndex);
        return strRetVal;
    }

2

দক্ষতার সাথে এটি করার জন্য আমি কয়েকটি এক্সটেনশন পদ্ধতি লিখেছিলাম:

    public static string JoinWithDelimiter(this IEnumerable<String> that, string delim) {
        var sb = new StringBuilder();
        foreach (var s in that) {
            sb.AppendToList(s,delim);
        }

        return sb.ToString();
    }

এটি নির্ভর করে

    public static string AppendToList(this String s, string item, string delim) {
        if (s.Length == 0) {
            return item;
        }

        return s+delim+item;
    }

3
স্ট্রিংগুলি সংহত করতে + অপারেটরটি ব্যবহার করা দুর্দান্ত নয় কারণ এটি প্রতিবার একটি নতুন স্ট্রিং বরাদ্দ করবে। আরও আরও, স্ট্রিংবিল্ডারকে স্পষ্টভাবে একটি স্ট্রিংয়ে ফেলে দেওয়া যেতে পারে, তবে ঘন ঘন এটি করা (আপনার লুপের প্রতিটি পুনরাবৃত্তি) স্ট্রিং বিল্ডার থাকার উদ্দেশ্যকে মূলত পরাস্ত করবে।
ড্যানিয়েল ফোর্টুনভ

2

আপনি ব্যবহার করতে পারেন .ToArray()উপর Listsএবং IEnumerables, এবং তারপর ব্যবহার String.Join()হিসাবে আপনি চেয়েছিলেন।


0

আপনি যে স্ট্রিংগুলিতে যোগ দিতে চান তা যদি অবজেক্টের তালিকায় থাকে তবে আপনিও এর মতো কিছু করতে পারেন:

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