W .NET mogę podać oba literały \rlub \nciągi znaków, ale jest sposób na wstawienie czegoś takiego jak znak specjalny „nowy wiersz”, na przykład Environment.NewLinewłaściwość statyczna?
W .NET mogę podać oba literały \rlub \nciągi znaków, ale jest sposób na wstawienie czegoś takiego jak znak specjalny „nowy wiersz”, na przykład Environment.NewLinewłaściwość statyczna?
Odpowiedzi:
Cóż, proste opcje to:
string.Format:
string x = string.Format("first line{0}second line", Environment.NewLine);Konkatenacja ciągów:
string x = "first line" + Environment.NewLine + "second line";Interpolacja ciągów (w C # 6 i nowszych):
string x = $"first line{Environment.NewLine}second line";Możesz też użyć \ n wszędzie i zamienić:
string x = "first line\nsecond line\nthird line".Replace("\n",
Environment.NewLine);
Zauważ, że nie możesz uczynić tego ciągiem stałym , ponieważ wartość Environment.NewLinebędzie dostępna tylko w czasie wykonywania.
Environment.NewLine? Wręcz przeciwnie, dobrze jest go używać
Jeśli chcesz mieć ciąg znaków const zawierający Environment.NewLine, możesz zrobić coś takiego:
const string stringWithNewLine =
@"first line
second line
third line";
Ponieważ jest to ciąg znaków const, odbywa się to w czasie kompilacji, dlatego jest to interpretacja nowej linii przez kompilator. Nie mogę znaleźć odniesienia wyjaśniającego to zachowanie, ale mogę udowodnić, że działa zgodnie z przeznaczeniem. Skompilowałem ten kod zarówno w systemie Windows, jak i Ubuntu (z Mono), a następnie zdemontowałem i oto wyniki:

Jak widać, w systemie Windows znaki nowej linii są interpretowane jako \ r \ n, aw systemie Ubuntu jako \ n
var sb = new StringBuilder();
sb.Append(first);
sb.AppendLine(); // which is equal to Append(Environment.NewLine);
sb.Append(second);
return sb.ToString();
first + Environment.NewLine + secondbardziej wydajnego i (IMO) łatwiejszego do odczytania?
String.Formatto da 1 ciąg na raz (ale wewnętrznie jest trochę powolny z powodu konkatenacji specyficznych dla kultury itp.), Podczas gdy konkatenacja ciągów - 1 wynikowy + 1 tymczasowy, prawda?
String.Concatenate, co bezpośrednio buduje tylko jeden ciąg wyjściowy (IIRC, jeśli ciągi są literałami, konkatenacja jest wykonywana w kompilatorze.
"a"+b+"c"+ditp.) Według wydajności są równe pojedynczemu? Lub po prostu przekonwertowany String.Concatenate(a,b,c,d,etc), prawda?
string.Formatw komentarzu. Łączenie ciągów nie da żadnych tymczasowych ciągów, ponieważ kompilator wywoła string.Concat(first, Environment.NewLine, second).
Jeszcze jeden sposób wygodnego umieszczenia Environment.NewLine w ciągu formatu. Chodzi o to, aby utworzyć metodę rozszerzającą ciąg, która formatuje ciąg w zwykły sposób, ale także zastępuje {nl} w tekście przez Environment.NewLine
Stosowanie
" X={0} {nl} Y={1}{nl} X+Y={2}".FormatIt(1, 2, 1+2);
gives:
X=1
Y=2
X+Y=3
Kod
///<summary>
/// Use "string".FormatIt(...) instead of string.Format("string, ...)
/// Use {nl} in text to insert Environment.NewLine
///</summary>
///<exception cref="ArgumentNullException">If format is null</exception>
[StringFormatMethod("format")]
public static string FormatIt(this string format, params object[] args)
{
if (format == null) throw new ArgumentNullException("format");
return string.Format(format.Replace("{nl}", Environment.NewLine), args);
}
Uwaga
Jeśli chcesz, aby ReSharper podświetlał twoje parametry, dodaj atrybut do powyższej metody
[StringFormatMethod ("format")]
Ta implementacja jest oczywiście mniej wydajna niż tylko String.Format
Może kogoś, kto byłby zainteresowany tym pytaniem, byłby również zainteresowany kolejnym pytaniem: Nazwane formatowanie ciągów w C #
string myText =
@"<div class=""firstLine""></div>
<div class=""secondLine""></div>
<div class=""thirdLine""></div>";
To nie to:
string myText =
@"<div class=\"firstLine\"></div>
<div class=\"secondLine\"></div>
<div class=\"thirdLine\"></div>";
static class MyClass
{
public const string NewLine="\n";
}
string x = "first line" + MyClass.NewLine + "second line"
Environment.NewLine- zobacz inne odpowiedzi.
const string
nowsze wersje .net pozwalają na użycie znaku $ przed literałem, co pozwala na użycie zmiennych wewnątrz, jak poniżej:
var x = $"Line 1{Environment.NewLine}Line 2{Environment.NewLine}Line 3";
Jeśli naprawdę chcesz, aby ciąg New Line był stałą, możesz to zrobić:
public readonly string myVar = Environment.NewLine;
Użytkownik słowa kluczowego readonly w C # oznacza, że ta zmienna może być przypisana tylko raz. Dokumentację na ten temat znajdziesz tutaj . Pozwala na deklarację stałej zmiennej, której wartość nie jest znana do czasu wykonania.
Bardziej podoba mi się „pythonowy sposób”
List<string> lines = new List<string> {
"line1",
"line2",
String.Format("{0} - {1} | {2}",
someVar,
othervar,
thirdVar
)
};
if(foo)
lines.Add("line3");
return String.Join(Environment.NewLine, lines);
Jeśli pracujesz z aplikacją internetową, możesz spróbować tego.
StringBuilder sb = new StringBuilder();
sb.AppendLine("Some text with line one");
sb.AppendLine("Some mpre text with line two");
MyLabel.Text = sb.ToString().Replace(Environment.NewLine, "<br />")
Jeśli rozumiem pytanie: para, "\r\n"aby uzyskać tę nową linię poniżej w textbox. Mój przykład zadziałał -
string s1 = comboBox1.Text; // s1 is the variable assigned to box 1, etc.
string s2 = comboBox2.Text;
string both = s1 + "\r\n" + s2;
textBox1.Text = both;
Typowa odpowiedź może być s1
s2 w text boxprzy użyciu zdefiniowanego stylu typu.