string.Join एक सूची <int> या अन्य प्रकार पर


86

मैं एक सरणी या सूची की सूची को अल्पविराम सीमांकित स्ट्रिंग में बदलना चाहता हूं, जैसे:

string myFunction(List<int> a) {
    return string.Join(",", a);
}

लेकिन string.Join केवल List<string>दूसरे पैरामीटर के रूप में लेता है । इसे करने का बेहतरीन तरीका क्या है?


2
आप किस C # / .NET के संस्करण का उपयोग कर रहे हैं?
मार्क बायर्स

के संभावित डुप्लिकेट stackoverflow.com/questions/3211422/...
goodeye

जवाबों:


149

सबसे अच्छा तरीका .NET 4.0 में अपग्रेड करना है जहां एक अधिभार है जो वह करता है जो आप चाहते हैं:

यदि आप अपग्रेड नहीं कर सकते हैं, तो आप Select और ToArray का उपयोग करके समान प्रभाव प्राप्त कर सकते हैं।

    return string.Join(",", a.Select(x => x.ToString()).ToArray());

यह भी मानता है कि वह कम से कम C # 3, .NET 3.5
एंथनी Pegram

अंतर्निहित ToArrayपद्धति के बजाय LINQ का उपयोग क्यों करें List<T>?
स्टीवन सुदित

2
क्योंकि वह एक सूची <int> होगा। Linq का चयन सूची <int> को IEnumerable <string> और फिर सरणी में कनवर्ट करता है।
ग्रेग बोगुमिल 15

4.0 में अपग्रेड करना मेरी स्थिति में व्यावहारिक नहीं है, लेकिन LINQ सॉल्यूशन वही है जिसकी मुझे तलाश थी। धन्यवाद!
कोड कमांडर

1
@gbogumil: क्षमा करें, यह ध्यान नहीं दिया गया कि यह एक था int
स्टीवन सुदित

5

.NET 3.5 के लिए जेनेरिक एन्यूमरेबल स्ट्रिंग का एक स्केलेबल और सुरक्षित कार्यान्वयन शामिल है। पुनरावृत्तियों का उपयोग इतना है कि स्ट्रिंग स्ट्रिंग के अंत में सम्मिलित स्ट्रिंग मान नहीं है। यह 0, 1 और अधिक तत्वों के साथ सही ढंग से काम करता है:

public static class StringExtensions
{
    public static string Join<T>(this string joinWith, IEnumerable<T> list)
    {
        if (list == null)
            throw new ArgumentNullException("list");
        if (joinWith == null)
            throw new ArgumentNullException("joinWith");

        var stringBuilder = new StringBuilder();
        var enumerator = list.GetEnumerator();

        if (!enumerator.MoveNext())
            return string.Empty;

        while (true)
        {
            stringBuilder.Append(enumerator.Current);
            if (!enumerator.MoveNext())
                break;

            stringBuilder.Append(joinWith);
        }

        return stringBuilder.ToString();
    }
}

उपयोग:

var arrayOfInts = new[] { 1, 2, 3, 4 };
Console.WriteLine(",".Join(arrayOfInts));

var listOfInts = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(",".Join(listOfInts));

का आनंद लें!


+1: यह मेरा पसंदीदा तरीका है प्री .NET 4.0। किलों की एक सूची से तार की एक पूरी तरह से नए सरणी का उत्पादन करने की तुलना में बहुत अधिक स्केलेबल ताकि String.Join(String, String[])इसे बुलाया जा सके। केवल एक ही बात कहूंगा कि Stringविरोध के रूप में इस पद्धति को विस्तार के रूप में देखना असामान्य है IEnumerable<String>- मैं इसे हमेशा विस्तार विधि कॉल की लंबी श्रृंखला के अंत में कहता हूं।
एलेक्स हम्फ्री

2
मैं पायथन से विचार चुरा लिया है कि अगर कोई मदद है!
नष्ट कर दिया

4

.NET 2.0:

static string IntListToDelimitedString(List<int> intList, char Delimiter)
{
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < intList.Count; i++)
    {
        builder.Append(intList[i].ToString());

        if (i != intList.Count - 1)
            builder.Append(Delimiter);
    }

    return builder.ToString();
}

3
एक अच्छा 2.0 दृष्टिकोण। हो सकता है कि आप विधि में शामिल करने के बजाय जुड़ने वाले चरित्र को एक पैरामीटर बनाना चाहें।
एंथनी पेग्राम

एक विशिष्ट अनुकूलन परीक्षण के बिना सीमांकक को जोड़ना है, फिर लूप से बाहर निकलने के बाद अंतिम चरित्र को हटा दें।
स्टीवन सुदित

@ सीन - मैं इसके बारे में सोच रहा था, लेकिन मुझे लगता है कि यह स्ट्रिंग की लंबाई पर भी निर्भर करेगा (परीक्षण के बिना मैं अनिश्चित हूं), इसलिए मैं साधारण बूल चेक से चिपक गया।
काइल रोसेन्डो

मुझे संदेह है कि अनुकूलन केवल लंबे तारों के लिए औसत दर्जे का होगा। ऐसा कहने के बाद, मुझे नहीं लगता कि यह कम लोगों के लिए भी धीमा होगा।
स्टीवन सुदित

2

यदि आप अभी तक .NET 4.0 की गहराई में उद्यम नहीं करना चाहते हैं तो यह उत्तर आपके लिए है।

String.Join () प्रत्येक तत्व के बीच निर्दिष्ट विभाजक का उपयोग करके, एक स्ट्रिंग सरणी के सभी तत्वों को मिलाता है।

वाक्य-विन्यास है

public static string Join(
    string separator,
    params string[] value
)

ज्वाइन करने की विधि में अपनी सूची की सूची पास करने के बजाय, मैं पहले स्ट्रिंग्स की एक सरणी बनाने का सुझाव देता हूं।

यहाँ मैं क्या प्रस्ताव है:

static string myFunction(List<int> a) {
    int[] intArray = a.ToArray();
    string[] stringArray = new string[intArray.Length];

    for (int i = 0; i < intArray.Length; i++)
    {
        stringArray[i] = intArray[i].ToString();
    }

    return string.Join(",", stringArray);
}

3
यह एक सभ्य दृष्टिकोण है यदि कोई अभी भी 2.0 पर है। हालाँकि, intArrayअनावश्यक है। List<int>अनुक्रमित है और एक Countसंपत्ति है, जो एक सरणी में रूपांतरण को शानदार बनाता है। आप इसे विधि में हार्डकोड करने के बजाय जुड़ने वाले चरित्र को एक पैरामीटर बनाना चाहते हैं।
एंथनी Pegram

2

एक समान एक्सटेंशन विधि थी जिसे मैंने इसमें संशोधित किया

public static class MyExtensions
{
    public static string Join(this List<int> a, string splitChar)
    {
        return string.Join(splitChar, a.Select(n => n.ToString()).ToArray());
    }
}

और आप इसे इस तरह से उपयोग करते हैं

var test = new List<int>() { 1, 2, 3, 4, 5 };
string s = test.Join(",");

.NET 3.5


यकीन नहीं होता कि मुझे यह पसंद है। IEnumerable<T>पहले से ही एक Joinविधि है, और यह नई विधि एक पूरी तरह से अलग ऑपरेशन करती है, जिससे इसका उपयोग काउंटरिनिटिव होता है। दूसरे, यदि आप यह विधि बनाने जा रहे हैं , तो आगे बढ़ें और इसे उदारतापूर्वक लागू करें।
एंथनी पेग्राम

यह रूबी में सरणियों में शामिल होने की विधि की नकल करने वाला एक हैक है। रूबी-doc.org/core/classes/Array.html#M002182
जोनास

इसके अलावा .TString () हमेशा टी का एक स्ट्रिंग प्रतिनिधित्व नहीं करता है इसलिए मुझे लगता है कि वास्तव में कुछ भ्रम हो सकता है।
जोनास एल्फस्ट्रोम

2

.NET 4.0 का उपयोग करना

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string s = myFunction(PopulateTestList());
        this.TextBox1.Text = s;
    }

    protected List<int> PopulateTestList()
    {
        List<int> thisList = new List<int>();
        thisList.Add(22);
        thisList.Add(33);
        thisList.Add(44);

        return thisList;
    }

    protected string myFunction(List<int> a)
    {
        return string.Join(",", a);
    }
}

2

.NET में सूची वर्ग में एक .ToArray()विधि है। कुछ इस तरह काम कर सकता है:

string myFunction(List<int> a)
{
    return string.Join(",", a.ToArray());
}

Ref: सूची <T> तरीके (MSDN)


यह answer from 2010पहले से ही बताता है कि, जैसा कि ToStringकरते समय निहित है string.Join
मिलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.