[c#] C #에서 여러 문자열 요소 바꾸기

이 작업을 수행하는 더 좋은 방법이 있습니까?

MyString.Trim().Replace("&", "and").Replace(",", "").Replace("  ", " ")
         .Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower();

하나의 작업으로 유지하기 위해 문자열 클래스를 확장했지만 더 빠른 방법이 있습니까?

public static class StringExtension
{
    public static string clean(this string s)
    {
        return s.Replace("&", "and").Replace(",", "").Replace("  ", " ")
                .Replace(" ", "-").Replace("'", "").Replace(".", "")
                .Replace("eacute;", "é").ToLower();
    }
}

재미를 위해 (그리고 의견에서 논쟁을 멈추기 위해) 아래의 다양한 예를 벤치마킹하는 요점을 밀었습니다.

https://gist.github.com/ChrisMcKee/5937656

정규식 옵션은 매우 점수가 높습니다. 사전 옵션이 가장 빨리 나타납니다. stringbuilder 교체의 긴 감기 버전은 짧은 손보다 약간 빠릅니다.



답변

더 빨리-아니요. 더 효과적-네, StringBuilder수업 을 사용한다면 . 구현시 각 작업은 상황에서 성능을 저하시킬 수있는 문자열 사본을 생성합니다. 문자열은 변경 불가능한 객체이므로 각 작업은 수정 된 복사본 만 반환합니다.

이 메서드가 Strings상당한 길이의 배수 에서 활발하게 호출 될 것으로 예상하는 경우 해당 구현을 StringBuilder클래스 로 “마이그레이션”하는 것이 좋습니다 . 이를 통해 모든 수정은 해당 인스턴스에서 직접 수행되므로 불필요한 복사 작업을 절약 할 수 있습니다.

public static class StringExtention
{
    public static string clean(this string s)
    {
        StringBuilder sb = new StringBuilder (s);

        sb.Replace("&", "and");
        sb.Replace(",", "");
        sb.Replace("  ", " ");
        sb.Replace(" ", "-");
        sb.Replace("'", "");
        sb.Replace(".", "");
        sb.Replace("eacute;", "é");

        return sb.ToString().ToLower();
    }
}


답변

단순히 예쁜 솔루션을 찾고 있고 몇 나노초를 절약 할 필요가 없다면 LINQ 설탕은 어떻습니까?

var input = "test1test2test3";
var replacements = new Dictionary<string, string> { { "1", "*" }, { "2", "_" }, { "3", "&" } };

var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value));


답변

더 효율적입니다.

public static class StringExtension
{
    public static string clean(this string s)
    {
        return new StringBuilder(s)
              .Replace("&", "and")
              .Replace(",", "")
              .Replace("  ", " ")
              .Replace(" ", "-")
              .Replace("'", "")
              .Replace(".", "")
              .Replace("eacute;", "é")
              .ToString()
              .ToLower();
    }
}


답변

좀 더 읽기 쉬울까요?

    public static class StringExtension {

        private static Dictionary<string, string> _replacements = new Dictionary<string, string>();

        static StringExtension() {
            _replacements["&"] = "and";
            _replacements[","] = "";
            _replacements["  "] = " ";
            // etc...
        }

        public static string clean(this string s) {
            foreach (string to_replace in _replacements.Keys) {
                s = s.Replace(to_replace, _replacements[to_replace]);
            }
            return s;
        }
    }

또한 StringBuilder에 대한 New In Town의 제안을 추가하십시오.


답변

제안 된 솔루션에서 최적화 할 수있는 한 가지가 있습니다. 를 많이 호출 Replace()하면 코드가 동일한 문자열을 여러 번 통과하도록합니다. 매우 긴 문자열을 사용하면 CPU 캐시 용량 누락으로 인해 솔루션이 느려질 수 있습니다. 한 번에 여러 문자열을 교체하는 것을 고려해야 수도 있습니다 .


답변

linq를 사용하는 또 다른 옵션은

[TestMethod]
public void Test()
{
  var input = "it's worth a lot of money, if you can find a buyer.";
  var expected = "its worth a lot of money if you can find a buyer";
  var removeList = new string[] { ".", ",", "'" };
  var result = input;

  removeList.ToList().ForEach(o => result = result.Replace(o, string.Empty));

  Assert.AreEqual(expected, result);
}


답변

비슷한 일을하고 있지만 제 경우에는 직렬화 / 역 직렬화를 수행하고 있으므로 양방향으로 이동할 수 있어야합니다. 나는 string [] []을 사용하는 것이 초기화를 포함하여 딕셔너리와 거의 동일하게 작동한다는 것을 알지만, 다른 방향으로도 갈 수 있고, 딕셔너리가 실제로 설정하지 않은 원래 값으로 대체물을 반환 할 수 있습니다.

편집 : Dictionary<Key,List<Values>>문자열 [] []과 동일한 결과를 얻기 위해 사용할 수 있습니다 .