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


199
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',');

यह काम नहीं करता है क्योंकि विभाजन विधि एक स्ट्रिंग लौटाती है []



जवाबों:


432

यहाँ यह करने का एक तरीका है:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();

11
वह भी हो सकता हैList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
21

2
क्या इसकी कोई आवश्यकता है new List<>?
लिक्विडपॉनी

2
@ लिकिडपोनी नं; आप ToList()इसके बजाय कॉल कर सकते हैं ; परिणाम अनिवार्य रूप से एक ही है: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); आपको एक या दूसरे को करने की आवश्यकता है, हालांकि, क्योंकि वापसी का मूल्य Select()एक है IEnumerable<>, लेकिन एक नहीं हैList<>
फोन

इस कार्यान्वयन में @LiquidPony हाँ के रूप Selectमें इस मामले में विस्तार लौटता है IEnumerable<Int32>और यह सूची नहीं है। हालांकि सूची में एक रचनाकार है जो एक अन्य संग्रह को स्रोत के रूप में स्वीकार करता है।
Oybek

8
मामले को संभालने के लिए जहां टैग एक खाली स्ट्रिंग है, का उपयोग करेंSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill

24

यदि आप कुछ सरल सत्यापन शामिल करना चाहते हैं और अमान्य मानों को छोड़ना चाहते हैं (अपवाद को फेंकने के बजाय), तो यहाँ कुछ है जो Tryadarar का उपयोग करता है:

string csv = "1,2,3,4,a,5";
int mos = 0;
var intList = csv.Split(',')
                    .Select(m => { int.TryParse(m, out mos); return mos; })
                    .Where(m => m != 0)
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5

संपादित करें: यहां एंटोनी द्वारा प्रतिक्रिया के आधार पर एक अद्यतन क्वेरी है। यह किसी भी खराब मान को फ़िल्टर करने के लिए पहले TryParse को कॉल करता है, और फिर वास्तविक रूपांतरण करने के लिए पार्स करता है।

string csv = "1,2,3,4,a,5,0,3,r,5";
int mos = 0;
var intList = csv.Split(',')
                    .Where(m => int.TryParse(m, out mos))
                    .Select(m => int.Parse(m))
                    .ToList();

//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5

संपादित 2: C # 7.0 के लिए एक अद्यतन क्वेरी, चार्ल्स बर्न्स से प्रतिक्रिया के लिए धन्यवाद। ध्यान दें कि हम इस दृष्टिकोण के साथ अतिरिक्त मॉस चर से छुटकारा पा लेते हैं, इसलिए यह थोड़ा क्लीनर है।

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();

1
विफल रहता है अगर 0 एक वैध इनपुट है!
एंटोनी मेल्टज़ाइम

2
C # 7.0 के साथ आप मच्छर की घोषणा को छोड़ सकते हैं और TryParse कॉल की जगह ले सकते हैंint.TryParse(m, out int _)
चार्ल्स बर्न्स

14

आप LINQ w / int.Parse()का उपयोग कर सकते हैं कन्वर्ट करने के string[]लिए एक IEnumerable<int>और फिर उस परिणाम को पास करने के लिए List<T>:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));


6

LINQ क्वेरी के बिना, आप इस विधि को चुन सकते हैं,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

और फिर आप इस सूची को पूर्णांक प्रकार में परिवर्तित कर सकते हैं ...


बस किसी को भी परिचित नहीं नोट = .ToList<string>()अभी भी ज़रूरत हैusing System.Linq;
बिल रावलिन्सन

4
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();

2
Docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/… के अनुसार .Select(x => x.Trim(), आपको जोड़ने की आवश्यकता नहीं है , क्योंकि पार्स स्वचालित रूप से आपके लिए किसी भी स्थान वर्ण को ट्रिम कर देता है।
फिलिप क्विनलन

2

यदि आप C # 3.5 का उपयोग कर रहे हैं तो आप इसे प्राप्त करने के लिए Linq का उपयोग कर सकते हैं

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

या छोटा वाला

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();


1

मैंने खालिद 13 के जवाब में संशोधन किया। यदि उपयोगकर्ता "0" की एक स्ट्रिंग लगाता है, तो उसका उत्तर परिणामी सूची से हटा देगा। मैंने कुछ ऐसा ही किया लेकिन एक अनाम वस्तु का इस्तेमाल किया।

var result = commaSeparatedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(s => new { didConvert = int.TryParse(s.TrimNullProtection(), out convertedInt), convertedValue = convertedInt })
            .Where(w => w.didConvert)
            .Select(s => s.convertedValue)
            .ToList();

TrimNullProtection एक कस्टम फ़ंक्शन है जो मैंने बनाया है, अगर स्ट्रिंग शून्य है तो सुरक्षा करता है।

उपरोक्त क्या है किसी भी तार को हटा दिया जाता है जो बिना किसी त्रुटि के परिवर्तित होने में सक्षम नहीं थे। यदि आपको रूपांतरण के साथ कोई समस्या थी, तो आपको त्रुटि की आवश्यकता है, तो स्वीकृत उत्तर को चाल करना चाहिए।


1

मैं इस पर अड़ गया और मैं बिना लाइनक के ही अपना समाधान साझा करना चाहता हूं। यह एक आदिम दृष्टिकोण है। सूची में गैर-पूर्णांक मान भी नहीं जोड़े जाएंगे।

List<int> TagIds = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

उम्मीद है की यह मदद करेगा।


-2

यह आसान है। पहले स्ट्रिंग को विभाजित करें। अल्पविराम (,) के बाद खाली स्थान ट्रिम करें। तब सिस्टम परिभाषित टोलिस्ट का उपयोग करें ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

',' के बाद के स्थान को हटाने के लिए और इस अल्पविराम से अलग पाठ को सूची में बदलें

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.