[C#] أسهل طريقة لتقسيم سلسلة على خطوط جديدة في .NET؟



Answers

ماذا عن استخدام StringReader ؟

using (System.IO.StringReader reader = new System.IO.StringReader(input)) {
    string line = reader.ReadLine();
}
Question

أحتاج إلى تقسيم سلسلة إلى خطوط جديدة في .NET والطريقة الوحيدة التي أعرف بها تقسيم السلاسل هي طريقة Split . لكن هذا لن يسمح لي (بسهولة) بالانقسام على سطر جديد ، فما هي أفضل طريقة للقيام بذلك؟




استنادًا إلى إجابة Guffa ، في فصل ملحق ، استخدم:

public static string[] Lines(this string source) {
    return source.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
}



حسنًا ، في الواقع يجب إجراء التقسيم:

//Constructing string...
StringBuilder sb = new StringBuilder();
sb.AppendLine("first line");
sb.AppendLine("second line");
sb.AppendLine("third line");
string s = sb.ToString();
Console.WriteLine(s);

//Splitting multiline string into separate lines
string[] splitted = s.Split(new string[] {System.Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);

// Output (separate lines)
for( int i = 0; i < splitted.Count(); i++ )
{
    Console.WriteLine("{0}: {1}", i, splitted[i]);
}



لم أكن أعرف عن Environment.Newline ، ولكن أعتقد أن هذا هو حل جيد للغاية.

كانت محاولتي هي:

        string str = "Test Me\r\nTest Me\nTest Me";
        var splitted = str.Split('\n').Select(s => s.Trim()).ToArray();

يزيل .Trim الإضافي أي \ r أو \ n قد لا يزال موجودًا (على سبيل المثال عندما يكون على النوافذ ولكن تقسيم سلسلة مع os x أحرف السطر الجديد). ربما ليس أسرع طريقة بالرغم من ذلك.

تصحيح:

وكما أوضح التعليقات بشكل صحيح ، فإن هذا يزيل أيضًا أية مسافات بيضاء في بداية السطر أو قبل سطر التغذية الجديد. إذا كنت بحاجة إلى الاحتفاظ بهذه المسافة البيضاء ، فاستخدم أحد الخيارات الأخرى.




فقط فكرت في أن أقوم بإضافتي الثنائية لأن الحلول الأخرى في هذا السؤال لا تندرج ضمن تصنيف الكود القابل لإعادة الاستخدام وغير ملائمة. كتلة التالي من التعليمات البرمجية توسيع كائن string بحيث يتوفر كطريقة طبيعية عند العمل مع السلاسل.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Collections.ObjectModel;

namespace System
{
    public static class StringExtensions
    {
        public static string[] Split(this string s, string delimiter, StringSplitOptions options = StringSplitOptions.None)
        {
            return s.Split(new string[] { delimiter }, options);
        }
    }
}

يمكنك الآن استخدام الدالة .Split() من أي سلسلة كما يلي:

string[] result;

// pass a string, and the delimiter
result = string.Split("My simple string", " ");

// split an existing string by delimiter only
string foo = "my - string - i - want - split";
result = foo.Split("-");

// you can even pass the split options param. when omitted it is
// set to StringSplitOptions.None
result = foo.Split("-", StringSplitOptions.RemoveEmptyEntries);

للانقسام على حرف جديد ، ما عليك سوى تمرير "\n" أو "\r\n" كمعلمة محددة.

التعليق: سيكون من الرائع أن تنفذ Microsoft هذا الحمل الزائد.




لمتغير السلسلة s :

s.Split(new string[]{Environment.NewLine},StringSplitOptions.None)

يستخدم هذا تعريف محيطك لنهايات الأسطر. في Windows ، نهايات الأسطر هي CR-LF (أحرف رجوع ، تغذية سطر) أو في أحرف الهروب C # \r\n .

هذا حل موثوق به ، لأنه إذا قمت بإعادة ترتيب السطور باستخدام String.Join ، فهذا يساوي السلسلة الأصلية الخاصة بك:

var lines = s.Split(new string[]{Environment.NewLine},StringSplitOptions.None);
var reconstituted = String.Join(Environment.NewLine,lines);
Debug.Assert(s==reconstituted);

ما الذي عليك عدم فعله:

  • استخدم StringSplitOptions.RemoveEmptyEntries ، لأن ذلك سيؤدي إلى StringSplitOptions.RemoveEmptyEntries الترميز مثل Markdown حيث تحتوي الأسطر الفارغة على الغرض التركيبي.
  • انقسام على new char[]{Environment.NewLine} ، لأنه في Windows سيؤدي هذا إلى إنشاء عنصر سلسلة فارغ لكل سطر جديد.



// using System.IO;

string textToSplit;

  if(textToSplit!=null)
   {
    List<string> lines = new List<string>();
    using (StringReader reader = new StringReader(textToSplit))
    {
        for (string line = reader.ReadLine(); line != null;line = reader.ReadLine())
        {
            lines.Add(line);
        }
    }
   }





Links