문자열의 마지막 문자를 삭제


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[] { ',' });있지만 아래에 더 나은 아이디어가 있습니다.
Henk Holterman

답변:


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

MSDN :

String.Remove (Int32) :

이 문자열에서 지정된 위치에서 시작하여 마지막 위치까지 계속되는 모든 문자를 삭제합니다.


1
마지막 문자를 제거하려면 마지막 문자를 제거하십시오. OP의 질문에 대해서는 후행 문자를 만들지 않으면 문제가 없어야합니다. OP의 보트에 있다면 @ Øyvind Bråthen 솔루션을 확인하십시오.
aloisdg codidact.com으로 이사

86

이런 식으로 하는건 어때?

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

많은 청소기.

그것은 내부의 모든 요소를 추가합니다 groupIdsA의 ','각 사이, 그러나 그것은을 넣어하지 ','말.


4
C # 4.0에서만. C # 3.5에서는 groupId를 배열로 변환해야합니다.
xanatos

3
이것은 OP 문제를 해결합니다.
aloisdg codidact.com으로 이사

29

C #의 문자열은 변경할 수 없습니다. 코드에서 당신이 할 때 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, 여기에 구현 된 방법은이 사용법에 대해 과도합니다. OP는 자신이 원하는 문자가 문자열의 끝에 있다는 것을 알았으므로 LastIndexOf를 통해 해당 문자열 을 검색 할 비용이 없습니다. 수락 된 답변을 가져 와서 확장 방법으로 만드십시오. 또는 int n끝에 제거 할 문자 수를 전달하여 해당 답변을 일반화 하십시오. 둘째, 길이가 0인지 테스트하지만 가능한 모든 예외를 제거하지는 않습니다. 할 더 좋을 것이다 int index = ..LastIndexOf..다음 if (index >= 0).
ToolmakerSteve

셋째, 매개 변수의 string character이름이 잘못되었습니다. 넷째, 미래의 프로그래머에게는 이것이 문자열 의 끝에서 문자 제거한다는 것이 즉시 명백하지 않습니다 . 아 잠깐만 요, 반드시 그렇게하는 것은 아닙니다. 문자열을 검색 중입니다. 가운데 어딘가에서 제거 될 수 있습니다. 이제 유지 보수 프로그래머는이 방법의 모든 용도를 검토하여 달성하려는 것이 무엇인지 확인해야합니다. 문자열의 끝에서 제거 해야하는 간단한 요구 때문에 호출하기에는 좋은 방법이 아닙니다. 모든 비판에 대해 죄송합니다. 나는이 방법을 채택한 모든 사람들을 위해 그렇게하므로 이해합니다.
ToolmakerSteve

다섯 번째, 질문의 맥락에서 사용하는 String.TrimEnd것이 더 적절할 것입니다. 그러나 이미 존재하고 3 년 전의 원래 질문과 다른 답변에서 언급되었으므로 새로운 방법을 발명 할 필요가 없습니다. 당신의 접근 방식의 장점은 무엇입니까?
ToolmakerSteve

7

후행 쉼표를 제거합니다.

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

이것은 거꾸로입니다. 처음에 쉼표를 추가하는 코드를 작성했습니다. 가 string.Join(",",g)이라고 가정하고 대신 사용해야 g합니다 string[]. 그것보다 더 나은 이름을 줘 g!


4

각 항목에 쉼표를 추가하는 대신 String.Join을 사용할 수 있습니다.

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 인 경우
완벽합니다

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.Joinforeach 훨씬 더 느린, 모두 접근이보다는 더 낫다
  • 마지막을 제거 할 필요가 없습니다 ,추가되지 않으므로
  • 증분 연산자 (+= )는 문자열에 추가하는 데 편리합니다.
  • .ToString() 문자열이 아닌 문자열을 연결할 때 자동으로 호출되므로 불필요
  • 큰 문자열을 처리 할 때는 문자열 StringBuilder을 연결하는 대신 고려해야합니다.

1
BUG – if 테스트를 취소해야합니다.if(strgroupids != string.Empty){
ToolmakerSteve

그러나 for-each를 사용하여 원하지 않는 ","없이 문자열을 작성하는 방법을 보여주는 답변을 추가해 주셔서 감사합니다! 람다를 만들 필요는 없습니다 ForEach. foreach (var g in groupIds) {작동 :)
ToolmakerSteve

N1 @ToolmakerSteve는 LINQ에 대해 다음 내가 걸린 작전 코드의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.