सूची <int> को अल्पविराम से अलग स्ट्रिंग में परिवर्तित करना


116

वहाँ एक सूची लेने और इसे अल्पविराम से अलग स्ट्रिंग में बदलने का एक तरीका है?

मुझे पता है कि मैं बस लूप कर सकता हूं और इसका निर्माण कर सकता हूं, लेकिन किसी तरह मैं आप में से कुछ लोगों को इसे करने का अधिक अच्छा तरीका समझता हूं?

मैं वास्तव में इस प्रकार के 'ट्रिक्स' सीखना चाहता हूं, इसलिए कृपया अपने द्वारा उपयोग की जाने वाली विधि पर डॉक्स के बारे में बताएं या लिंक करें।

जवाबों:


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

7
चतुर लेकिन धीमा और फूला हुआ, क्योंकि यह प्रति तत्व एक स्ट्रिंग आवंटित करता है। StringBuilder का उपयोग करना अधिक कुशल होगा।
स्टीवन सुदित

3
जो मैंने ऑनलाइन (त्वरित खोज) देखा था, वह स्ट्रिंग। जॉइनिंग, स्ट्रिंगब्यूलर का उपयोग करने से तेज है।
यूरी फकटोरोविच

3

6
मुझे लगता है कि स्टीवन स्ट्रिंग के बजाय n.ToString () भाग की बात कर रहा है।
लार्सनल

9
लार्सनल: लेकिन StringBuilder.Append (Int32) आंतरिक रूप से वैसे भी पूर्णांक पर कॉल करता है। StringBuilder जादुई रूप से प्रत्येक तत्व के लिए एक स्ट्रिंग आवंटित करने की लागत से बचने नहीं करता है; यह सिर्फ यह अच्छी तरह से दृष्टि से बाहर tucks।
itowlson

115

सरल उपाय है

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

मैंने इसे अभी अपने कोड में उपयोग किया है, फंटास्टिक का काम कर रहा है।


1
धन्यवाद! यह सुंदर दृष्टिकोण है
इरफान अशरफ

2
यह एक बेहतर दृष्टिकोण है तो स्वीकृत उत्तर एक है। इस दृष्टिकोण के साथ आपको Linq का आयात नहीं करना है और यह तेज़ है।
JoKeRxbLaCk

ठंडा! मैं कभी भी स्ट्रिंग नहीं जानता था। कोई भी सामान्य अधिभार नहीं है। धन्यवाद।
mrmashal


6

इस समस्या के थोड़े अधिक जटिल संस्करण के लिए लगभग एक गज़िल के समाधान के लिए - जिनमें से कई धीमे, छोटे हैं, या संकलन भी नहीं करते हैं - इस विषय पर मेरे लेख के लिए टिप्पणियों को देखें:

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

और StackOverflow टिप्पणी:

एरिक लिपर्ट की चुनौती "अल्पविराम", सर्वश्रेष्ठ उत्तर?


लिंक के लिए धन्यवाद। यह स्ट्रिंग समवर्ती समस्या अधिक जटिल और अधिक शैक्षिक हो गई है, जितना मैंने उम्मीद की थी!
स्टीवन सुदित

4

अतिरिक्त ठंडक के लिए मैं इसे IEnumerable <T> पर एक विस्तार विधि बनाऊंगा ताकि यह किसी भी IEnumerable पर काम करे:

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) StringBuilder के लिए एक क्षमता निर्दिष्ट करें।
स्टीवन सुदित

1
यदि आप परावर्तक को खोदते हैं, तो यह पता चलता है कि बफर आकार को जोड़ने के लिए लंबाई में शामिल हों, और लूप के बाहर पहले तार को जोड़कर "पंप" को चुभता है, और फिर, लूप के अंदर, बिना शर्त परिसीमन से पहले अगले तार। कुछ असुरक्षित / आंतरिक ट्रिक्स के साथ संयुक्त, यह बहुत तेज़ होना चाहिए।
स्टीवन सुदित

@ सीन: आपकी सलाह का पालन किया।
cdiggins

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

आप का उपयोग कर सकते हैं, System.Linq पुस्तकालय; यह अधिक कुशल है:

using System.Linq;
string str =string.Join(",", MyList.Select(x => x.NombreAtributo));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.