بناء جملة C# - تقسيم السلسلة إلى صفيف بفاصلة، وتحويلها إلى قائمة عامة، وترتيب عكسي

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

  •  10-07-2019
  •  | 
  •  

سؤال

ما هو بناء الجملة الصحيح لهذا:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

ما الذي أعبث به؟ماذا يعني مصدر؟

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

المحلول

والمشكلة هي أن كنت تتصل List<T>.Reverse() التي ترجع void.

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

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

وأو:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

وهذا الأخير هو أكثر تكلفة، وعكس على IEnumerable<T> تعسفي ينطوي التخزين المؤقت كافة البيانات ومن ثم الرضوخ كل شيء - في حين List<T> يمكن القيام بكل عكس "في مكان". (الفرق هنا هو أنه استدعاء الأسلوب تمديد Enumerable.Reverse<T>()، بدلا من أسلوب مثيل List<T>.Reverse()).

وبعد أكثر كفاءة، يمكنك استخدام:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

وهذا يتجنب خلق أي مخازن ذات حجم مناسب - على حساب أخذ أربعة بيانات حيث واحد سوف تفعل ... من أي وقت مضى، يصل وزنه القراءة ضد الأداء في حالة استخدام حقيقية

نصائح أخرى

وأنا أدرك أن هذا السؤال هو قديمة جدا، ولكن كان لدي مشكلة مماثلة، إلا كان سلسلة بلدي المساحات المدرجة في ذلك. لتلك التي تحتاج إلى معرفة كيفية فصل سلسلة مع أكثر من مجرد فواصل:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

ووStringSplitOptions يزيل السجلات التي من شأنها أن تكون سوى مساحة شار ...

List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

وهذا واحد يعمل.

وجرب هذا:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();

وماذا لديك في عداد المفقودين هنا هو أن .Reverse () هو أسلوب الفراغ. ليس من الممكن تعيين نتيجة .Reverse () لمتغير. ولكن يمكنك تغيير تتمكن من استخدام Enumerable.Reverse () والحصول على النتائج الخاصة بك

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

والفرق هو أن Enumerable.Reverse () بإرجاع IEnumerable بدلا من أن تكون عودة باطلة

إذا كنت تحاول أن

  1. استخدم محددات متعددة
  2. تصفية أي سلاسل فارغة
  3. تقليم المسافات البادئة/الزائدة

يجب أن يعمل ما يلي:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

انتاج |

  • توم
  • رحلة بحرية
  • سكوت
  • بوب
  • في

الآن يمكنك بوضوح عكس الترتيب كما اقترح الآخرون.

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