W .NET mogę podać oba literały \r
lub \n
ciągi znaków, ale jest sposób na wstawienie czegoś takiego jak znak specjalny „nowy wiersz”, na przykład Environment.NewLine
właściwość statyczna?
W .NET mogę podać oba literały \r
lub \n
ciągi znaków, ale jest sposób na wstawienie czegoś takiego jak znak specjalny „nowy wiersz”, na przykład Environment.NewLine
wł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.NewLine
bę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 + second
bardziej wydajnego i (IMO) łatwiejszego do odczytania?
String.Format
to 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"+d
itp.) Według wydajności są równe pojedynczemu? Lub po prostu przekonwertowany String.Concatenate(a,b,c,d,etc)
, prawda?
string.Format
w 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 box
przy użyciu zdefiniowanego stylu typu.