C # में एक स्ट्रिंग में अंतिम वर्ण कैसे हटाएं?


94

निम्नलिखित तरीके से पोस्ट अनुरोध के लिए एक स्ट्रिंग का निर्माण,

  var itemsToAdd = sl.SelProds.ToList();
  if (sl.SelProds.Count() != 0)
  {
      foreach (var item in itemsToAdd)
      {
        paramstr = paramstr + string.Format("productID={0}&", item.prodID.ToString());
      }
  }

परिणाम प्राप्त करने के बाद paramstr, मुझे &इसमें अंतिम वर्ण हटाने की आवश्यकता है

C # का उपयोग करके स्ट्रिंग में अंतिम वर्ण कैसे हटाएं ?


2
लगता है कि यह बेहतर नहीं है कि इसे पहली जगह में जोड़ दिया जाए, लेकिन अन्यथा आप पैरामस्ट्रस्ट की कोशिश कर सकते हैं। स्टुस्ट्रिंग (0, paramstr.Length - 1)
जैको

यदि आपके ठेस को मनमाने ढंग से पात्रों को रखने की अनुमति है, विशेष रूप से &, आपको यह सुनिश्चित करने की आवश्यकता है कि यह ठीक से बच जाए, जैसे कि @MarcGravell का जवाब।
यूजीन बेरेसोवस्की

जवाबों:


75

string.Joinइसके बजाय इसका निर्माण करें :

var parameters = sl.SelProds.Select(x=>"productID="+x.prodID).ToArray();
paramstr = string.Join("&", parameters);

string.Joinएक सेपरेटर ( "&") और स्ट्रिंग्स की सरणी ( ) लेता है, और एरे के parametersप्रत्येक तत्व के बीच सेपरेटर को सम्मिलित करता है।


1
यदि आप स्ट्रिंग के अंत में एक साइन इन नहीं करना चाहते हैं तो यह ध्यान देने योग्य है कि यह उपयोगी है।
अम्मर

मुझे पता था कि यह रूबी में था, मुझे पता नहीं था कि यह C # में था और मैं एक .net देव हूं। मुझे बहुत शर्मिंदगी महसूस होती है
जैक मार्केटी

मुझे विश्वास नहीं हो रहा है कि यह चुना हुआ उत्तर था ... @BrianRasmussen द्वारा इसके ठीक नीचे एक बहुत सरल है।
फास्टट्रैक

@FastTrack ने शीर्षक में प्रश्न का उत्तर देते हुए, मूल समस्या को हल किया। मेरी शिकायत: यदि आप धाराप्रवाह होने जा रहे हैं, तो बस एक पंक्ति में यह सब क्यों नहीं करते।
ग्राहम

241

व्यक्तिगत रूप से मैं रोब के सुझाव के साथ जाऊंगा, लेकिन यदि आप एक (या अधिक) विशिष्ट अनुगामी चरित्र को हटाना चाहते हैं तो आप उपयोग कर सकते हैं TrimEnd। उदाहरण के लिए

paramstr = paramstr.TrimEnd('&');

15
ध्यान रखें कि ट्रिमएंड उस चरित्र की सभी अनुगामी घटनाओं को '&' को हटा देगा ... इसलिए यदि स्ट्रिंग '&&&' के साथ समाप्त हो जाती है, तो ट्रिमएंड उन सभी में से 3 और 'को हटा देगा, न कि केवल अंतिम। ओपी जो चाहता है वह हो सकता है या नहीं।
डग एस

3
@DougS FWIW मैंने लेखक को "एक (या अधिक) हटाएं" किया।
ब्रायन रासमुसेन

एक सरल समाधान के लिए +1, इस प्रकार आसानी से अन्य समस्याओं के लिए एक घटक के रूप में उपयोग किया जा सकता है। मैं यह सुनिश्चित करने के लिए कई हिस्सों से एक मार्ग बनाने के लिए खोज कर रहा था कि मेरे पास डबल या लापता स्लैश न हों। इस तकनीक के साथ ट्रिमएंड और ट्रिमस्टार्ट का संयोजन यह सुनिश्चित करता है।
जोप्पी

1
@ जोपी: सुझाव का उपयोग करते हुए Path.Combine, जो सभी पथ विभाजकों को समझता है। Leastways का उपयोग Trimजो एक बार में शुरू और समाप्त होता है।
निगेल टच

@ रास्ते में मुझे जो परेशानी हुई है। कॉम्बिनेशन यह है कि यदि दूसरा तर्क स्लैश के साथ शुरू होता है, तो इसे एक पूर्ण मार्ग के रूप में व्याख्या किया जाता है, और परिणाम पूर्ण पथ है; यह कुछ ऐसा है जिसे मैं अपने कोड से कॉल करने वाले लोगों को 'बचाना' पसंद करता हूं। ट्रिम पर अच्छा बिंदु, हालांकि :)
जोपी


15

इसे इस्तेमाल करे:

paramstr.Remove((paramstr.Length-1),1);

2
क्या आप अपने उत्तर को थोड़ा समझाने के बारे में विचार करेंगे, ताकि साथ आने वाले अन्य लोगों को बेहतर विचार हो कि आपने इसे क्यों सुझाया?
एंड्रयू बार्बर

1
@Altaf पटेल के उत्तर में सिबलिंग विधि String.Remove मेथड (Int32) का उपयोग किया गया है, जो इस स्थिति में यकीनन अधिक सीधा है। हालाँकि, String.Remove Method (Int32, Int32) के बारे में जानना अच्छा है , जो स्रोत स्ट्रिंग के भीतर कहीं से भी मनमानी लंबाई के विकल्प को ट्रिम करने की क्षमता प्रदान करता है।
डेविड आरआर

13

मैं इसे पहली जगह में नहीं जोड़ूंगा:

 var sb = new StringBuilder();

 bool first = true;
 foreach (var foo in items) {
    if (first)
        first = false;
    else
        sb.Append('&');

    // for example:
    var escapedValue = System.Web.HttpUtility.UrlEncode(foo);

    sb.Append(key).Append('=').Append(escapedValue);
 }

 var s = sb.ToString();

मैं इस स्निपेट की पठनीयता के बारे में कुछ नहीं कहूंगा, लेकिन यह ऐसा तरीका है जिससे मैं यह करूंगा।
मत्ती विर्ककुनेन

2
यह भी सस्ता और आसान है बस स्ट्रीपबर्ल की लंबाई को एक के बाद एक लूप किया जाता है।
मैट ग्रीर

+1 इसे हटाने के बजाय जोड़ने के लिए नहीं, + = के बजाय स्ट्रिंग स्ट्रिंग का उपयोग करने के लिए, और एपिनेट करने के बजाय समवर्ती और संलग्न करने के लिए। :)
गुफ़ा

1
इस समाधान के साथ समस्या यह है कि "अगर" ऑपरेटर को "एन" बार कहा जाता है।
मैगलन

11
string str="This is test string.";
str=str.Remove(str.Length-1);

1
से String.Remove विधि (Int32) : "रिटर्न एक नया स्ट्रिंग जिसमें वर्तमान उदाहरण में सभी वर्ण, एक निर्दिष्ट स्थान पर शुरुआत और अंतिम स्थिति के माध्यम से जारी नष्ट कर दिया गया है।"
डेविड

7

इसका इस्तेमाल करें तो बेहतर है string.Join

 class Product
 {
   public int ProductID { get; set; }
 }
 static void Main(string[] args)
 {
   List<Product> products = new List<Product>()
      {   
         new Product { ProductID = 1 },
         new Product { ProductID = 2 },
         new Product { ProductID = 3 }
      };
   string theURL = string.Join("&", products.Select(p => string.Format("productID={0}", p.ProductID)));
   Console.WriteLine(theURL);
 }

आप .ToArray()अपने Joinबयान में गायब हैं । हालांकि +1। मेरी मदद की।
देसैव

1
@desaivv: नहीं, मैं इस अधिभार का उपयोग कर रहा था: public static string Join<T>(string separator, IEnumerable<T> values)यह C # 4.0 में नया है :)
चेंग चेन

आह मेरी बुर अभी भी VS2008 का उपयोग 3.0 के साथ
desaivv

5

StringBuilderजब बहुत सारे तारों को समेटना हो तो उपयोग करना अच्छा रहेगा और आप अंतिम विधि से छुटकारा पाने के लिए निकालें विधि का उपयोग कर सकते हैं।

StringBuilder paramBuilder = new StringBuilder();

foreach (var item in itemsToAdd)
{
    paramBuilder.AppendFormat(("productID={0}&", item.prodID.ToString());
}

if (paramBuilder.Length > 1)
    paramBuilder.Remove(paramBuilder.Length-1, 1);

string s = paramBuilder.ToString();

मुझे यह भी याद है कि आप paramBuilder.Length - 1अंतिम चरित्र को हटाने के लिए भी उपयोग कर सकते हैं ।
डैन डेपलो

1
paramstr.Remove((paramstr.Length-1),1);

यह एक स्ट्रिंग के अंत से एक एकल वर्ण को निकालने का काम करता है। लेकिन अगर मैं इसे हटाने के लिए, 4 वर्णों का उपयोग करता हूं, तो यह काम नहीं करता है:

paramstr.Remove((paramstr.Length-4),1);

एक विकल्प के रूप में, मैंने इस दृष्टिकोण का उपयोग किया है:

DateFrom = DateFrom.Substring(0, DateFrom.Length-4);

2
स्ट्रिंग के अंत से 4 वर्णों को निकालने के लिए String.Remove Method (Int32, Int32) का उपयोग करना । result = source.Remove((source.Length - 4), 4);
डेविड आरआर

0

जोड़ें a StringBuilder extension method

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

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

yourStringBuilder.RemoveLast(",");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.