2012-10-03 12 views
6

यह प्रश्न केवल शैक्षणिक उद्देश्यों के लिए है।स्ट्रिंग में शामिल हों [] स्ट्रिंग का उपयोग किए बिना। जॉइन

के मैं निम्नलिखित कोड है मान लेते हैं ...

var split = line.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries); 
var elem = new XElement("shop"); 
elem.SetAttributeValue("name", split.Take(split.Length - 1)); <===== 
elem.SetAttributeValue("tin", split.Last()); 

और मैं तीर इस के रूप में एक ही परिणाम का उत्पादन करने के साथ लाइन चाहते हैं ...

string.Join(string.Empty, split.Take(split.Length - 1)); 

... string.Join का उपयोग किए बिना।

क्या यह संभव है? मुझे ऐसा करने के लिए LINQ कथन नहीं मिल रहा है ... उम्मीद है कि आप पहले से ही जानते हैं!

+2

दिलचस्प जवाब है, लेकिन मैं उत्सुक हूँ, आप एक अलग दृष्टिकोण के लिए क्यों देख रहे हैं स्ट्रिंग से। जॉइन? और साथ ही, आप कहते हैं कि आप एक लिंक कथन की तलाश में हैं, लेकिन फिर आपका स्वीकार्य उत्तर (वास्तव में एक अच्छा) बिल्कुल लिंक का उपयोग नहीं कर रहा है :) – Wasp

+0

@Wasp, फिर सवाल अकादमिक था। इसके अलावा, मेरा मतलब था कि __not__ का कहना है कि मुझे LINQ के माध्यम से हल करने की आवश्यकता है, लेकिन अधिक है कि मैं इसे करने के लिए LINQ कथन की तलाश कर रहा था क्योंकि मैं ___thought___ था जो सबसे अच्छा तरीका था। हालांकि, अंत में, गुफा ने मुझे एक और सही तरीका दिखाया। –

+1

तो सवाल _should_ किया गया है - मैं इस स्ट्रिंग के अंतिम खंड को कैसे अनदेखा कर सकता हूं और कॉमा को स्ट्रिप कर सकता हूं। आप भाग्यशाली हो गए हैं और आपको जवाब दिया है _needed_, लेकिन उत्तर नहीं दिया गया है जिसका आपने _asked किया है। –

उत्तर

4

या तो Split का उपयोग न करें, अभी पिछले अल्पविराम लगाने और Substring का उपयोग स्ट्रिंग विभाजित करने के लिए:

int pos = line.LastIndexOf(','); 
var elem = new XElement("shop"); 
elem.SetAttributeValue("name", line.Substring(0, pos).Replace(",", String.Empty)); 
elem.SetAttributeValue("tin", line.Substring(pos + 1)); 
+0

बहुत अच्छा जवाब और समग्र रूप से सर्वोत्तम दृष्टिकोण। मैं अपने समग्र समाधान के साथ अपना जवाब संपादित करने जा रहा हूं क्योंकि एक नई आवश्यकता बढ़ी है और मैं चाहता हूं कि लोग इसे देखें ('नाम' फ़ील्ड में सीएसवी के माध्यम से फ़ाइल भेज रहे हैं, भले ही इसका उपयोग किया जाना चाहिए एक बेहतर delimiter हुह?) –

+0

@ माइक: ठीक है, आप कॉमा के बिना तारों में शामिल हो रहे थे। आप उन्हें 'रीप्लेस' के साथ पहली स्ट्रिंग से हटा सकते हैं। – Guffa

+0

मैं गलत था! मुझे इसे संशोधित करने की आवश्यकता नहीं थी क्योंकि केवल दो मान हैं और आप हर बार अंतिम स्थिति में सबस्ट्रिंग चलाते हैं। बहुत, बहुत, बहुत अच्छा समाधान और यह भी बेहद कुशल है! –

2

कैसे

के बारे में
split.Take(split.Length - 1).Aggregate((s1,s2)=> s1 + s2); 

या गैर LINQ बराबर:

string s = ""; 
for(int i = 0; i < split.Length - 1; i++) 
{ 
    s += split[i]; 
} 
return s; 
+0

यह सही है, लेकिन प्रदर्शन वर्ग है। –

+0

बहुत धीमी गति से ... – SimpleVar

+1

+1 ... @YoryeNathan, यह एक पूरी तरह से स्वीकार्य समाधान है। Quadratic रनटाइम, सच है, लेकिन शायद उपयोग-मामले के लिए यह अभी भी 'स्ट्रिंगबिल्डर 'का उपयोग कर समाधान से * तेज * हो सकता है: ओपी के कोड को देखते हुए इसका उपयोग' नाम 'नामक एक्सएमएल विशेषता मान सेट करने के लिए किया जाता है - आप कब तक संग्रह की उम्मीद है? –

6

हे (एन) प्रदर्शन के लिए एक StringBuilder का उपयोग करना:

split 
    .Take(split.Length - 1) 
    .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString(); 

वस्तु से बचने के लिए है संयुक्त LINQ कॉल और स्थैतिक तरीकों के पेड़ की अजीबता, फिर एक सीधा समाधान एक exte है nsion विधि:

public static string Join(this IEnumerable<string> self, string separator = "") 
{ 
    return string.Join(separator, self); 
} 

और फिर:

split.Take(split.Length - 1).Join(); 

मैं जटिल भाव में string.Join का उपयोग कर की तुलना में बेहतर पढ़ने के लिए इस पाते हैं।

+0

+1 –

0
var strs = new string[100]; 
... 

var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)), 
          (sb, curr) => sb.Append(s + ", ")).ToString(); 

अभी अंत से अंतिम "," को हटाने की आवश्यकता है।

+0

'स्ट्रिंगबिल्डर' आकार देने से आकार एक गति उत्पन्न करता है, लेकिन एसिम्प्टोटिक स्पीडअप नहीं। यह 'Sum' से ओवरहेड से कम हो सकता है। –

+0

चेक के लायक .. – SimpleVar

0
string myString = "Hello World" 
var myList= new List<int>(); 

for (int i = 0; i < 10; i++) 
    myList.Add(i); 

var newList = myList.Aggregate(string.Empty, (current, num) => current + myString.Substring(num, 1)); 
संबंधित मुद्दे