لماذا محاولة مني لتقليم السلاسل في قائمة <سلسلة> لا تظهر للعمل؟

StackOverflow https://stackoverflow.com/questions/205299

سؤال

وحاولت التعليمة البرمجية التالية في LINQPad وحصلت على النتائج الواردة أدناه:

List<string> listFromSplit = new List<string>("a, b".Split(",".ToCharArray())).Dump();
listFromSplit.ForEach(delegate(string s) 
{ 
  s.Trim(); 
});
listFromSplit.Dump();
<اقتباس فقرة>   

و"أ" و "ب"

وحتى الرسالة ب لم تحصل على المسافة البيضاء إزالة كما كنت أتوقع ...؟

وأي شخص يحصل على أي أفكار

[ملحوظة: .Dump () طريقة هو menthod التمديد في LINQPad أن تطبع محتويات أي كائن في طريقة لطيفة تنسيق بذكاء]

هل كانت مفيدة؟

المحلول

وطريقة String.Trim () بإرجاع سلسلة تمثل سلسلة المحدثة. لم يتم تحديث الكائن السلسلة نفسها، وإنما إنشاء واحدة جديدة.

هل يمكن أن تفعل هذا:

s = s.Trim();

ولكن لا يمكنك تحديث مجموعة أثناء تعداد عبره لذلك كنت تريد إما ملء قائمة جديدة أثناء تعداد خلال احدة موجودة أو تجميع قائمة يدويا باستخدام مجموعة سلسلة إرجاعها بواسطة String.Split.

وتعبئة قائمة جديدة:

List<string> temp = new List<string>("a, b".Split(",".ToCharArray()));
List<string> listFromSplit = new List<string>();

temp.ForEach(delegate(string s) 
{ 
    listFromSplit.Add(s.Trim()); 
});

listFromSplit.Dump();

وملء يدويا:

string[] temp = "a, b".Split(",".ToCharArray());
List<string> listFromSplit = new List<string>();

foreach (string s in temp)
{
    listFromSplit.Add(s.Trim()); 
};

listFromSplit.Dump();

نصائح أخرى

وكنت مجرد خلق سلسلة قلصت، وليس تخصيص أي شيء لذلك.

var s = "  asd   ";
s.Trim();

وسوف يتم تحديث، في حين ..

var s = "   asd   ";
s = s.Trim();

وسوف ..

var listFromSplit = "a, b".Split(',').Select(s=>s.Trim());

وسوف، وأفترض، أن يكون كيف كنت اذهب حول هذا الموضوع.

وعلاوة على ذلك إلى الإجابة المرسلة بواسطة <لأ href = "https://stackoverflow.com/questions/205299/why-does-my-attempt-to-trim-strings-in-a-liststring-not-appear- إلى العمل / 205509 # 205509 "> أدريان كون هل يمكن أن تفعل ما يلي:

var result = listFromSplit.Select(s => s.Trim());

ومثيلات سلسلة هي ثابتة. أي شيء يبدو لتعديل واحد، ويخلق مثيل جديد بدلا من ذلك.

وأنت لا تعيين نتيجة قلصت إلى أي شيء. هذا هو الخطأ الكلاسيكي، لقد حصلت للتو من العادة لجعل هذا الخطأ مع string.Replace:)

وليس لدي أي IDE وتشغيلها، ولكن هذا يجب أن ننجز العمل (إلا إذا كنت مخطئا):

var result = from each in listFromSplit select each.Trim();

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

List<string> listFromSplit =
     new List<string>( "a , b ".Split( new char[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries ));

والخيارات LINQ قدمت الآخرين يجب أن تعمل بشكل جيد. كخيار آخر، وهنا هو طريقة تمديد استخدام للحلقة:

    public static void TrimCollection(this IList<string> stringCollection) {

        for (int i = 0; i <= stringCollection.Count() - 1; i++)
            stringCollection[i] = stringCollection[i].Trim();

    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top