2010-10-22 9 views
7

यहां जावा शैली में एक संक्षिप्त शब्द बनाने के लिए मैं एक फ़ंक्शन लिखूंगा:LINQ का उपयोग कर सी # में स्ट्रिंग से संक्षिप्त नाम प्राप्त करें?

 string makeAcronym(string str) 
    { 
     string result = ""; 
     for (int i = 0; i < str.Length; i++) 
     { 
      if (i == 0 && str[i].ToString() != " ") 
      { 
       result += str[i]; 
       continue; 
      } 

      if (str[i - 1].ToString() == " " && str[i].ToString() != " ") 
      { 
       result += str[i]; 
      } 
     } 

     return result; 
    } 

क्या LINQ के साथ मैं इसे और अधिक सुरुचिपूर्ण तरीके से कर सकता हूं, या सी # फ़ंक्शन में निर्मित कुछ का उपयोग कर सकता हूं?

उत्तर

13

यहां विकल्पों

एक .NET 4 एकमात्र विकल्प string.Join का उपयोग कर के एक जोड़े हैं:

string acronym = string.Join(string.Empty, 
     input.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(s => s[0]) 
    ); 

.NET 3.5 (या 4.0) में, आप कर सकते हैं:

string acronym = new string(input.Split(new[] {' '}, 
     stringSplitOptions.RemoveEmptyEntries).Select(s => s[0]).ToArray()); 

आपके मूल तर्क के आधार पर एक और विकल्प (मेरी व्यक्तिगत पसंद):

string acronym = new string(
     input.Where((c,i) => c != ' ' && (i == 0 || input[i-1] == ' ')) 
     .ToArray() 
    ); 
+0

आपको अपने चयन के बाद वहां TooArray() की आवश्यकता होगी। (जब तक .net4 को अब इस रूपांतरण की आवश्यकता नहीं है ... मुझे नहीं पता) – spender

+0

@ स्पेंडर: .NET 4 में नहीं (अंत में उन्होंने IENumerable पर एक जोड़ा जोड़ा) - केवल 3.5 में ... http://msdn.microsoft .com/en-us/library/dd783876.aspx –

+0

उदाहरण 1 में एक भटकना कॉमा जैसा दिखता है, जो अभी भी मेरे लिए संकलित नहीं होगा। –

0
string makeAcronym(string str) 
{ 
    return new string(str.Split(new [] {' '}, 
     StringSplitOptions.RemoveEmptyEntries).Select(s => s[0]).ToArray()); 
} 
+0

@Reed तय किया गया। डैन सीमा –

4

आप यह काफी अच्छी तरह से एक Regex/Linq कॉम्बो उपयोग कर सकते हैं:

String 
    .Join("", 
     Regex 
      .Matches("this is a test",@"(?<=^|)\w") 
      .Cast<Match>() 
      .Select(m=>m.Value) 
      .ToArray() 
    ) 
+2

क्या आपको वास्तव में रेगेक्स की आवश्यकता है? 'Char.IsWhitespace' के बारे में क्या? –

+0

नहीं, आपको शायद रेगेक्स की आवश्यकता नहीं है, लेकिन यह आपको शब्दों के बीच सफेद जगह का प्रतिनिधित्व करने पर बेहतर नियंत्रण देता है। यदि सूची में विराम चिह्न शामिल है (उदाहरण के लिए), रेगेक्स शायद इसे हल करने का सबसे छोटा साधन होगा। उपयोगी हो सकता है। – spender

2

LINQ इस के लिए काम कर सकते हैं लेकिन आम तौर पर मैं इसे StringBuilder उदाहरण का उपयोग करते हुए string मूल्यों को बनाने के लिए बेहतर है पाते हैं। यह आपको अनावश्यक string आवंटन से बचने की अनुमति देता है।

string makeAcronym(string str) { 
    var builder = new StringBuilder(); 
    for (var i = 0; i < str.Length; i++) { 
    var c = str[i]; 
    if (c == ' ') { 
     continue; 
    } 
    if (i == 0 || str[i-1] == ' ') { 
     builder.Append(c); 
    } 
    } 
    return builder.ToString(); 
} 
+0

@Reed, जरूरी नहीं। मैंने लूप के आंतरिक हिस्से को बनाने के लिए 'char' को वापस करने के लिए एक LINQ क्वेरी बनाने के लिए भी विचार किया (मैं बस आलसी हो गया और इसे मार्ग के लिए किया)। इस बारे में मेरा एकमात्र प्रदर्शन पहलू यह कहना है कि यह किसी भी मध्यवर्ती तार आवंटित नहीं करता है। – JaredPar

+0

मुझे एहसास हुआ कि मैंने आपकी टिप्पणी को फिर से पढ़ा है, इसलिए मैंने अपनी टिप्पणी हटा दी;) हालांकि, मैं सहमत हूं कि मध्यवर्ती तारों को खत्म करना यहां बहुत महत्वपूर्ण है। –

4

आप LINQ समेकित विधि का उपयोग काफी सुंदर तरीके से करने के लिए कर सकते हैं।

कुछ इस तरह:

private static string MakeAcronym2(string str) 
{ 
    return str.Split(' ').Aggregate("", (x, y) => x += y[0]); 
} 
+0

यह विफल रहता है अगर कोई सबस्ट्रिंग खाली है। और स्ट्रिंगबिल्डर का उपयोग करके एकत्रीकरण तेजी से होगा। – CodesInChaos

+1

मैं इस धारणा को चुनौती देता हूं कि स्ट्रिंगबिल्डर अभ्यास में अवधारणात्मक रूप से तेज़ होगा। – mtreit

+0

@CodeInChaos: इसके अलावा, क्या आप इनपुट का एक उदाहरण दे सकते हैं जिससे यह असफल हो जाएगा?मुझे पूरा यकीन नहीं है कि मैं आपके खाली सबस्ट्रिंग स्टेटमेंट से सहमत हूं। धन्यवाद! – mtreit

8

यहाँ एक तकनीक मैं अब तक नहीं देखा है। यह इस धारणा पर निर्भर करता है कि सभी अक्षरों को संक्षेप में होना चाहिए (और केवल वे अक्षर) स्ट्रिंग में ऊपरी-मामले में हैं।

string MakeAcronym(string input) 
{ 
    var chars = input.Where(Char.IsUpper).ToArray(); 
    return new String(chars); 
} 

// MakeAcronym("Transmission Control Protocol") == "TCP" 
संबंधित मुद्दे