จะลบอักขระสุดท้ายในสตริงใน 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
เดาว่าดีกว่าที่จะไม่เพิ่มในตอนแรก แต่อย่างอื่นคุณสามารถลองใช้ paramstr. Substring (0, paramstr.Length - 1)
Jaco Pretorius

ในกรณีที่ prodID ของคุณได้รับอนุญาตให้มีอักขระตามอำเภอใจโดยเฉพาะ&คุณต้องตรวจสอบให้แน่ใจว่าได้รับการหลีกเลี่ยงอย่างถูกต้องเช่นคำตอบของ @MarcGravell ทำ
Evgeniy Berezovsky

คำตอบ:


75

สร้างด้วยstring.Joinแทน:

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

string.Joinใช้ตัวแยก ( "&") และอาร์เรย์ของสตริง ( parameters) และแทรกตัวแยกระหว่างแต่ละองค์ประกอบของอาร์เรย์


1
ควรสังเกตว่าสิ่งนี้มีประโยชน์หากคุณไม่ต้องการให้มีเครื่องหมาย & ที่ท้ายสตริง
Ammar

ฉันรู้ว่าสิ่งนี้อยู่ใน Ruby ไม่รู้ว่ามันอยู่ใน C # และฉันเป็น. net dev ฉันรู้สึกอายมากฮ่า ๆ
Jack Marchetti

ฉันไม่อยากจะเชื่อเลยว่านี่เป็นคำตอบที่เลือก ... คำตอบที่อยู่ด้านล่างนี้โดย @BrianRasmussen นั้นง่ายกว่ามาก
FastTrack

@FastTrack มันแก้ปัญหารากเทียบกับการตอบคำถามในชื่อเรื่อง ข้อร้องเรียนของฉัน: ถ้าคุณจะคล่องทำไมไม่ทำทั้งหมดในบรรทัดเดียว
Graham

241

โดยส่วนตัวแล้วฉันจะไปตามคำแนะนำของ Rob แต่ถ้าคุณต้องการลบอักขระต่อท้ายหนึ่งตัว (หรือมากกว่า) ที่คุณสามารถTrimEndใช้ได้ เช่น

paramstr = paramstr.TrimEnd('&');

15
โปรดทราบว่า TrimEnd จะลบการต่อท้ายทั้งหมดของอักขระนั้น '&' ... ดังนั้นหากสตริงลงท้ายด้วย '&&&' ดังนั้น TrimEnd จะลบทั้ง 3 ใน '&' ไม่ใช่แค่รายการสุดท้าย นั่นอาจเป็นสิ่งที่ OP ต้องการหรือไม่ก็ได้
Doug S

3
@ DougS FWIW ฉันเขียน "ลบหนึ่ง (หรือมากกว่า)"
Brian Rasmussen

+1 สำหรับวิธีง่ายๆที่สามารถใช้เป็นส่วนประกอบสำหรับปัญหาอื่น ๆ ได้อย่างง่ายดาย ฉันกำลังค้นหาวิธีแก้ปัญหาในการสร้างเส้นทางจากหลายส่วนเพื่อให้แน่ใจว่าฉันไม่มีเครื่องหมายทับสองครั้งหรือขาดหายไป การรวม TrimEnd และ TrimStart ด้วยเทคนิคนี้ช่วยให้มั่นใจได้
Joeppie

1
@Joeppie: แนะนำให้ใช้Path.Combineซึ่งเข้าใจตัวคั่นเส้นทางทั้งหมด อย่างน้อยที่สุดใช้Trimซึ่งเริ่มต้นและสิ้นสุดในครั้งเดียว
Nigel Touch

@Nigel ปัญหาที่ฉันมีกับ Path รวมคือถ้าอาร์กิวเมนต์ที่สองเริ่มต้นด้วยเครื่องหมายทับมันจะถูกตีความว่าเป็นเส้นทางที่แน่นอนและผลลัพธ์ก็คือเส้นทางที่แน่นอน นี่คือสิ่งที่ฉันชอบที่จะ 'บันทึก' คนที่โทรหารหัสของฉัน จุดที่ดีในการตัดแต่ง :)
Joeppie


15

ลองสิ่งนี้:

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

2
คุณช่วยอธิบายคำตอบของคุณเล็กน้อยเพื่อให้คนอื่น ๆ ที่เข้ามามีความคิดที่ดีขึ้นว่าทำไมคุณถึงแนะนำคำตอบนี้
Andrew Barber

1
คำตอบโดย @Altaf Patel ใช้วิธีการแบบพี่น้องString.Remove Method (Int32)ซึ่งตรงประเด็นกว่าในสถานการณ์นี้ อย่างไรก็ตามสิ่งที่ควรรู้เกี่ยวกับString.Remove Method (Int32, Int32)ซึ่งมีความสามารถในการตัดแต่งสตริงย่อยที่มีความยาวโดยพลการจากที่ใดก็ได้ภายในสตริงต้นทาง
DavidRR

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();

ฉันจะไม่พูดอะไรเกี่ยวกับความสามารถในการอ่านของตัวอย่างข้อมูลนี้ แต่นี่คือวิธีที่ฉันจะทำ
Matti Virkkunen

2
นอกจากนี้ยังมีราคาถูกและง่ายเพียงแค่ลดความยาวของ StringBuilder ลงทีละหนึ่งหลังจากวนซ้ำ
Matt Greer

+1 สำหรับการไม่เพิ่มแทนการลบออกสำหรับการใช้ StringBuilder แทน + = และสำหรับการต่อท้ายแทนการเชื่อมต่อและต่อท้าย :)
Guffa

1
ปัญหาในการแก้ปัญหานี้คือตัวดำเนินการ "if" เรียกว่า "n" ครั้ง
magallanes

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

1
จากString.Remove Method (Int32) : "ส่งคืนสตริงใหม่ที่อักขระทั้งหมดในอินสแตนซ์ปัจจุบันเริ่มต้นที่ตำแหน่งที่ระบุและดำเนินการต่อจนถึงตำแหน่งสุดท้ายจะถูกลบออก"
DavidRR

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 แม้ว่า ช่วยฉันด้วย
One-One

1
@desaivv: ไม่ฉันใช้โอเวอร์โหลดนี้: public static string Join<T>(string separator, IEnumerable<T> values)มันใหม่ใน C # 4.0 :)
Cheng Chen

ฉันไม่ดี ยังคงใช้ VS2008 กับ 3.0
One-One

5

เป็นแนวทางปฏิบัติที่ดีที่จะใช้StringBuilderเมื่อเชื่อมต่อสตริงจำนวนมากจากนั้นคุณสามารถใช้เมธอด Remove เพื่อกำจัดอักขระสุดท้าย

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เพื่อลบอักขระตัวสุดท้ายได้ด้วย
Dan Diplo

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

วิธีนี้ใช้เพื่อลบอักขระเดี่ยวออกจากส่วนท้ายของสตริง แต่ถ้าฉันใช้มันเพื่อลบพูด4ตัวอักษรมันใช้ไม่ได้:

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

อีกทางเลือกหนึ่งฉันใช้วิธีนี้แทน:

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

2
ใช้String.Remove Method (Int32, Int32)เพื่อลบอักขระ4ตัวออกจากท้ายสตริง: result = source.Remove((source.Length - 4), 4);.
DavidRR

0

เพิ่มไฟล์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(",");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.