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 개발자입니다. 나는 너무 당황 lol
Jack Marchetti

나는 이것이 선택된 대답이라는 것을 믿을 수 없다 ... @BrianRasmussen의 바로 아래에있는 것이 훨씬 간단합니다.
FastTrack

@FastTrack 제목의 질문에 답하는 대신 근본적인 문제를 해결했습니다. 나의 불만 : 당신이 유창하게 될 것이라면, 왜 모든 것을 한 줄로하지 않는가?
Graham

241

개인적으로 저는 Rob의 제안을 따르 겠지만 하나 이상의 특정 후행 문자를 제거하려면를 사용할 수 있습니다 TrimEnd. 예

paramstr = paramstr.TrimEnd('&');

15
TrimEnd는 해당 문자 '&'의 모든 후행 항목을 제거하므로 문자열이 '&&&'로 끝나는 경우 TrimEnd는 마지막 항목뿐만 아니라 해당 '&'3 개를 모두 제거합니다. 그것은 OP가 원하는 것일 수도 있고 아닐 수도 있습니다.
Doug S

3
@DougS FWIW 필자가 "하나 이상 제거"를했습니다.
Brian Rasmussen 2014

+1은 간단한 솔루션이므로 다른 문제의 구성 요소로 쉽게 사용할 수 있습니다. 슬래시가 이중이거나 누락되지 않도록 여러 부분에서 경로를 만드는 솔루션을 찾고있었습니다. TrimEnd와 TrimStart를이 기술과 결합하면이를 보장합니다.
Joeppie

1
@Joeppie : Path.Combine모든 경로 구분 기호를 이해 하는 사용을 제안 합니다. Trim한 번에 시작하고 끝나는 최소 사용 .
Nigel Touch

@Nigel Path.Combine의 문제는 두 번째 인수가 슬래시로 시작하면 절대 경로로 해석되고 결과는 절대 경로라는 것입니다. 이것은 내 코드를 호출하는 사람들을 '저장'하는 것을 선호하는 것입니다. 하지만 트림에 대한 좋은 점 :)
Joeppie

22
string source;
// source gets initialized
string dest;
if (source.Length > 0)
{
    dest = source.Substring(0, source.Length - 1);
}

15

이 시도:

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

2
당신이 제안한 이유를 다른 사람들이 더 잘 알 수 있도록 당신의 대답을 조금 설명해 주시겠습니까?
Andrew Barber

1
@Altaf Patel 의 대답 은 형제 메서드 String.Remove Method (Int32) 를 사용합니다. 이는이 상황에서 더 간단합니다. 그러나 소스 문자열 내에서 임의 길이의 하위 문자열을 트리밍 할 수있는 기능을 제공하는 String.Remove 메서드 (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

제거하는 대신 추가하지 않고 + = 대신 StringBuilder를 사용하고 연결 및 추가하는 대신 추가를 연결하는 경우 +1. :)
Guffa

1
이 솔루션의 문제점은 "if"연산자가 "n"번 호출된다는 것입니다.
magallanes dec


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. 나를 도와 주었다.
desaivv

1
@desaivv : 아니요,이 오버로드를 사용했습니다. public static string Join<T>(string separator, IEnumerable<T> values) 그것은 : C # 4.0의 새로운 기능
쳉 첸

아, 나쁘다. 아직 3.0 VS2008를 사용하여
desaivv

5

StringBuilder많은 문자열을 연결할 때 a를 사용하는 것이 좋습니다. 그런 다음 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 2011

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

이것은 문자열 끝에서 단일 문자를 제거하기 위해 작동합니다. 그러나 4 자를 제거하는 데 사용하면 작동하지 않습니다.

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

대안으로이 방법을 대신 사용했습니다.

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

2
사용 String.Remove 방법 (INT32, INT32은) , 제거하는 4 개 문자열의 끝에서 문자 : result = source.Remove((source.Length - 4), 4);.
DavidRR

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(",");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.