이 작업을 수행하는 더 좋은 방법이 있습니까?
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();
}
}
재미를 위해 (그리고 의견에서 논쟁을 멈추기 위해) 아래의 다양한 예를 벤치마킹하는 요점을 밀었습니다.
정규식 옵션은 매우 점수가 높습니다. 사전 옵션이 가장 빨리 나타납니다. 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>>
문자열 [] []과 동일한 결과를 얻기 위해 사용할 수 있습니다 .