لماذا محاولة مني لتقليم السلاسل في قائمة <سلسلة> لا تظهر للعمل؟
-
03-07-2019 - |
سؤال
وحاولت التعليمة البرمجية التالية في 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();
}