문제

'MagicFunction'의 구현은 다음 (NUNIT) 테스트 패스를 만드는 방법은 무엇입니까?

public MagicFunction_Should_Prepend_Given_String_To_Each_Line()
{
    var str = @"line1
line2
line3";

    var result = MagicFunction(str, "-- ");

    var expected = @"-- line1
-- line2
-- line3";

    Assert.AreEqual(expected, result);
}
도움이 되었습니까?

해결책 8

답변 해 주셔서 감사합니다. 확장 방법으로 MagicFunction을 구현했습니다. Thomas Levesque의 답변을 활용하지만 모든 주요 환경을 처리하도록 향상되었으며 출력 문자열이 입력 문자열의 동일한 Newline terminator를 사용하기를 원한다고 가정합니다.

나는 Thomas Levesque의 답변 (Spencer Ruport 's, Fredrik Mork's, Lazarus 및 Jdunkerley에 대한 대답을 선호했습니다. 내 블로그에 성능 결과를 게시하고 나중에 관심있는 사람들을 위해 여기에 링크 할 것입니다.

(분명히 'MagicFunctionio'의 함수 이름은 변경되어야합니다. 나는 'prependeachlinewith'와 함께 갔다)

public static string MagicFunctionIO(this string self, string prefix)
{
  string terminator = self.GetLineTerminator();
  using (StringWriter writer = new StringWriter())
  {
    using (StringReader reader = new StringReader(self))
    {
      bool first = true;
      string line;
      while ((line = reader.ReadLine()) != null)
      {
        if (!first)
          writer.Write(terminator);
        writer.Write(prefix + line);
        first = false;
      }
      return writer.ToString();
    }
  }
}

public static string GetLineTerminator(this string self)
{
  if (self.Contains("\r\n")) // windows
    return "\r\n";
  else if (self.Contains("\n")) // unix
    return "\n";
  else if (self.Contains("\r")) // mac
    return "\r";
  else // default, unknown env or no line terminators
    return Environment.NewLine;
}

다른 팁

string MagicFunction(string str, string prepend)
{
   str = str.Replace("\n", "\n" + prepend);
   str = prepend + str;
   return str;
}

편집하다:
다른 사람들이 지적했듯이, Newline 캐릭터는 환경마다 다릅니다. 동일한 환경에서 생성 된 파일 에서이 기능을 사용하려는 경우 시스템이 제대로 작동합니다. 그러나 Linux 상자에 파일을 생성 한 다음 Windows 상자로 전송하면 다른 유형의 Newline을 지정해야합니다. Linux는 n을 사용하고 Windows를 사용하기 때문에이 코드는 Windows 및 Linux 파일 모두에서 작동합니다. Mac을 믹스에 던지는 경우 ( r) 조금 더 관련된 것을 생각해 내야합니다.

private static string MagicFunction(string str, string prefix)
{
    string[] lines = str.Split(new[] { '\n' });
    return string.Join("\n", lines.Select(s => prefix + s).ToArray());
}

어때요 :

string MagicFunction(string InputText) {
    public static Regex regex = new Regex(
          "(^|\\r\\n)",
        RegexOptions.IgnoreCase
        | RegexOptions.CultureInvariant
        | RegexOptions.IgnorePatternWhitespace
        | RegexOptions.Compiled
        );

    // This is the replacement string
    public static string regexReplace = 
          "$1-- ";

    // Replace the matched text in the InputText using the replacement pattern
    string result = regex.Replace(InputText,regexReplace);

    return result;
}
var result = "-- " + str.Replace(Environment.NewLine, Environment.NewLine + "-- ");

원한다면 Windows ( r n) Newlines 또는 Unix Ones ( n)에 대처하려면 :

var result = "-- " + str.Replace("\n", "\n-- ");

r을 만질 필요가 없습니다. 그러나 UNIX와 Windows를 교차시키고 싶다면 다음과 같습니다.

var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- ");

이를 수행하고 로컬 OS 형식에서 결과를 반환합니다.

당신은 그렇게 할 수 있습니다 :

public string MagicFunction2(string str, string prefix)
{
    bool first = true;
    using(StringWriter writer = new StringWriter())
    using(StringReader reader = new StringReader(str))
    {
        string line;
        while((line = reader.ReadLine()) != null)
        {
            if (!first)
                writer.WriteLine();
            writer.Write(prefix + line);
            first = false;
        }
        return writer.ToString();
    }
}

문자열을 Environment.Newline으로 분할 한 다음 각 문자열에 접두사를 추가 한 다음 환경 .newline으로 결합 할 수 있습니다.

string MagicFunction(string prefix, string orignalString)
{
    List<string> prefixed = new List<string>();
    foreach (string s in orignalString.Split(new[]{Environment.NewLine}, StringSplitOptions.None))
    {
        prefixed.Add(prefix + s);
    }

    return String.Join(Environment.NewLine, prefixed.ToArray());
}

이건 어때. 많은 라인을 선제 할 계획 인 경우 StringBuilder를 사용합니다.

string MagicFunction(string input)
{
  StringBuilder sb = new StringBuilder();
  StringReader sr = new StringReader(input);
  string line = null;

  using(StringReader sr = new StringReader(input))
  {
    while((line = sr.ReadLine()) != null)
    {
      sb.Append(String.Concat("-- ", line, System.Environment.NewLine));
    }
  }
  return sb.ToString();
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top