स्ट्रिंग के अंतिम चार्ट को हटाएं


259

मैं एक सूची में बहुत सारी जानकारी प्राप्त कर रहा हूं, एक डेटाबेस से जुड़ा हुआ हूं और मैं किसी ऐसे व्यक्ति के लिए एक समूह बनाना चाहता हूं, जो वेबसाइट से जुड़ा है।

मैं इसका उपयोग परीक्षण करने के लिए करता हूं लेकिन यह गतिशील नहीं है, इसलिए यह वास्तव में खराब है:

string strgroupids = "6";

मैं अब इसका इस्तेमाल करना चाहता हूं। लेकिन वापस लौटी स्ट्रिंग कुछ इस तरह है1,2,3,4,5,

groupIds.ForEach((g) =>
{
    strgroupids = strgroupids  + g.ToString() + ",";
    strgroupids.TrimEnd(',');
});

strgroupids.TrimEnd(new char[] { ',' });

मैं इसके ,बाद हटाना चाहता हूं 5लेकिन यह निश्चित रूप से काम नहीं कर रहा है।


9
प्रत्यक्ष समस्या का समाधान है, strgroupids = strgroupids.TrimEnd(new char[] { ',' });लेकिन नीचे बेहतर विचार हैं।
हेन्क होल्टरमैन

जवाबों:


613
strgroupids = strgroupids.Remove(strgroupids.Length - 1);

MSDN:

String.Remove (Int32):

इस स्ट्रिंग के सभी पात्रों को एक निर्दिष्ट स्थान पर शुरू करता है और अंतिम स्थिति के माध्यम से जारी रखता है


1
अंतिम चार को हटाने के लिए बिल्कुल सही यदि आप अंतिम चार को हटाना चाहते हैं। ओपी के सवाल के लिए, समस्या नहीं होनी चाहिए यदि आप एक अनुगामी चार्ट नहीं बनाते हैं। यदि आप ओपी की नाव में हैं, तो Checkyvind Bråthen समाधान देखें।
aloisdg codidact.com

86

इस तरह से करने के बारे में क्या

strgroupids = string.Join( ",", groupIds );

एक बहुत क्लीनर।

यह अंदर सभी तत्वों को जोड़ देंगे, groupIdsएक साथ ','प्रत्येक के बीच, लेकिन यह एक डाल नहीं होगा ','अंत में।


4
केवल C # 4.0 में। C # 3.5 में आपको groupIds को array में बदलना होगा।
xanatos

3
यह ओपी समस्या को ठीक करेगा।
aloisdg codidact.com पर जा रहा है।

29

सी # में स्ट्रिंग्स अपरिवर्तनीय हैं। जब अपने कोड में आप करते हैं strgroupids.TrimEnd(',');या स्ट्रिंग संशोधित नहीं हैstrgroupids.TrimEnd(new char[] { ',' });strgroupids

आपको strgroupids = strgroupids.TrimEnd(',');इसके बजाय कुछ करने की ज़रूरत है ।

यहाँ से उद्धृत करने के लिए :

स्ट्रिंग्स अपरिवर्तनीय हैं - ऑब्जेक्ट के बनने के बाद एक स्ट्रिंग ऑब्जेक्ट की सामग्री को नहीं बदला जा सकता है, हालांकि सिंटैक्स बनाता है ऐसा प्रतीत होता है जैसे कि आप ऐसा कर सकते हैं। उदाहरण के लिए, जब आप इस कोड को लिखते हैं, तो संकलक वास्तव में वर्णों के नए अनुक्रम को रखने के लिए एक नया स्ट्रिंग ऑब्जेक्ट बनाता है, और उस नए ऑब्जेक्ट को b को असाइन किया जाता है। स्ट्रिंग "h" तब कचरा संग्रहण के लिए योग्य है।


11

एक विस्तार विधि जोड़ें।

public static string RemoveLast(this string text, string character)
{
    if(text.Length < 1) return text;
    return text.Remove(text.ToString().LastIndexOf(character), character.Length);
}

फिर उपयोग करें:

yourString.RemoveLast(",");

विस्तार विधि बनाने का मूल विचार अच्छा है। हालाँकि, IMHO, इस पद्धति का उपयोग करने के लिए यहाँ लागू किया गया है। ओपी को पता था कि वह जो चरित्र चाहता था वह स्ट्रिंग के अंत में था, इसलिए लास्टइंडेक्सऑफ़ के माध्यम से उस स्ट्रिंग को खोजने का कोई कारण नहीं है । बस स्वीकृत उत्तर लें, और इसे एक विस्तार विधि बनाएं। या int nअंत में हटाने के लिए वर्णों की संख्या , उस उत्तर को सामान्यीकृत करें । दूसरा, आप शून्य लंबाई के लिए परीक्षण करते हैं, लेकिन यह सभी संभावित अपवादों को समाप्त नहीं करता है। int index = ..LastIndexOf..तब करना बेहतर होगा if (index >= 0)
टूलमेकरसैट

तीसरा, पैरामीटर string characterखराब रूप से नामित है। चौथा, भविष्य के प्रोग्रामरों के लिए यह तुरंत स्पष्ट नहीं है कि यह स्ट्रिंग के अंत में पात्रों को हटा रहा है । ओह रुको, ऐसा जरूरी नहीं है। यह स्ट्रिंग खोज रहा है। इसे बीच में कहीं से हटाया जा सकता था। अब रखरखाव प्रोग्रामर को विधि के सभी उपयोगों की जांच करनी है, यह देखने के लिए कि क्या पूरा करने की कोशिश कर रहा था। एक स्ट्रिंग के अंत से हटाने की इस सरल आवश्यकता के लिए, कॉल करने का एक अच्छा तरीका नहीं है। सभी आलोचनाओं के लिए क्षमा करें; मैं इस विधि को अपनाने वाले किसी भी व्यक्ति के लिए ऐसा करता हूं, इसलिए वे समझते हैं।
टूलमेकरसैट

पांचवें, प्रश्न के संदर्भ में, String.TrimEndउपयोग करने के लिए अधिक उपयुक्त होगा। लेकिन रुको, जो पहले से मौजूद है - और मूल प्रश्न और 3 साल पहले कई अन्य उत्तरों में उल्लेख किया गया था - एक नई विधि का आविष्कार करने की आवश्यकता नहीं है! आपके दृष्टिकोण का क्या लाभ है?
टूलमेकरसेव

7

किसी भी अनुगामी अल्पविराम को निकालता है:

while (strgroupids.EndsWith(","))
    strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

यह पीछे की ओर है, हालांकि, आपने वह कोड लिखा है जो पहले स्थान पर अल्पविराम जोड़ता है। आपको string.Join(",",g)इसके बजाय उपयोग करना चाहिए , यह मानते हुए gकि ए string[]। इसे भी एक बेहतर नाम gदें!


4

प्रत्येक आइटम के लिए अल्पविराम जोड़ने के विकल्प के रूप में आप स्ट्रिंग का उपयोग कर सकते हैं।

var strgroupids = String.Join(",",  groupIds);

यह सरणी में प्रत्येक तत्व के बीच सेपरेटर (", इस उदाहरण में") को जोड़ देगा ।


3
string strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    strgroupids = strgroupids + g.ToString() + ",";
});

strgroupids = strgroupids.Substring(0, strgroupids.Length - 1);

ध्यान दें कि ForEachयहाँ का उपयोग आम तौर पर "गलत" माना जाता है (उदाहरण के लिए पढ़ें http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx )

कुछ LINQ का उपयोग कर:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => p + q + ',');
strgroupids = strgroupids.Substring(0, str1.Length - 1);

अंत-विकल्प के बिना:

string strgroupids = groupIds.Aggregate(string.Empty, (p, q) => (p != string.Empty ? p + "," + q : q.ToString()));

1
@KierenJohnstone string.Joinएकदम सही है यदि आपके पास स्रोत के रूप में तार की एक सरणी है या आपके पास C # 4.0 है
xanatos

3

Sll के समाधान के लिए अतिरिक्त: यदि अंत में कुछ खाली हैं तो स्ट्रिंग को ट्रिम करना बेहतर है।

strgroupids = strgroupids.Remove(strgroupids.Trim().Length - 1);

2

string.Joinबेहतर है, लेकिन अगर आप वास्तव में एक LINQ चाहते हैं ForEach:

var strgroupids = string.Empty;

groupIds.ForEach(g =>
{
    if(strgroupids != string.Empty){
        strgroupids += ",";
    }

    strgroupids += g;
});

कुछ नोट:

  • string.Joinऔर foreachदोनों इस से बेहतर हैं, काफी धीमी, दृष्टिकोण
  • ,जब तक इसे जोड़ा नहीं जाता है, तब तक अंतिम को हटाने की कोई आवश्यकता नहीं है
  • वेतन वृद्धि ऑपरेटर ( +=) स्ट्रिंग्स के लिए अपील करने के लिए आसान है
  • .ToString() यह अनावश्यक है क्योंकि इसे स्वचालित रूप से कहा जाता है जब गैर-तार को समाप्‍त करता है
  • बड़े तारों को संभालते समय, तार StringBuilderको समतल करने के बजाय विचार किया जाना चाहिए

1
बग - अगर परीक्षण को उलटने की जरूरत है - होना चाहिएif(strgroupids != string.Empty){
टूलमेकरसैट

लेकिन एक जवाब जोड़ने के लिए धन्यवाद, जो दिखाता है कि कैसे प्रत्येक को अवांछित के बिना स्ट्रिंग बनाने के लिए उपयोग करना है "," अंत में! ध्यान रखें कि एक लैम्ब्डा और बनाने के लिए नहीं है ForEach; foreach (var g in groupIds) {के रूप में अच्छी तरह से काम करता है :)
टूलमेकरसेव

n1 @ToolmakerSteve, LINQ के बारे में तो यह ओपी कोड मैंने लिया है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.