سؤال

لقد حصلت على مجموعة JS التي تكتب إلى ملف نصي على الخادم باستخدام StreamWriter. هذا هو الخط الذي يفعله:

sw.WriteLine(Request.Form["seatsArray"]);

في الوقت الحالي ، يتم كتابة سطر واحد بكامل محتويات الصفيف عليه. أريد كتابة خط جديد بعد كل 5 فواصل. مثال صفيف:

BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,

يجب الإخراج:

BN,ST,A1,303,601,
BN,ST,A2,303,621,
BN,WC,A3,303,641,

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

كيف يمكنني أن أحصل على هذا؟

شكرًا!

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

المحلول

حسنًا ، ها هي أبسط الجواب يمكنني التفكير في:

string[] bits = Request.Form["seatsArray"].Split(',');

for (int i = 0; i < bits.Length; i++)
{
    sw.Write(bits[i]);
    sw.Write(",");
    if (i % 5 == 4)
    {
        sw.WriteLine();
    }
}

إنها ليست أنيقة بشكل رهيب ، لكنها ستنجز المهمة ، على ما أعتقد.

قد ترغب في ذلك بعد ذلك لإنهاء الخط الحالي ، إذا لزم الأمر:

if (bits[i].Length % 5 != 0)
{
    sw.WriteLine();
}

أنا متأكد من أن هناك طرقًا أكثر ذكاءً ... لكن هذا بسيط.

سؤال واحد: هل القيم دائماً ثلاثة أحرف طويلة؟ لأنه إذا كان الأمر كذلك ، فأنت في الأساس فقط كسر السلسلة كل 20 حرفًا ...

نصائح أخرى

شيء مثل:

var input = "BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,";
var splitted = input.Split(',');

var cols = 5;
var rows = splitted.Length / cols;

var arr = new string[rows, cols];

for (int row = 0; row < rows; row++)
    for (int col = 0; col < cols; col++)
        arr[row, col] = splitted[row * cols + col];

سأحاول العثور على حل أكثر أناقة. بشكل صحيح مع بعض النمط الوظيفي فوقه.

تحديث: فقط اكتشف أنه ليس ما تحتاجه في الواقع. مع هذا تحصل على مجموعة ثنائية الأبعاد مع 3 صفوف و 5 أعمدة.

هذا سوف يعطيك 3 خطوط. ليس لديهم نهاية "،". هل تريد ذلك؟ هل تريد دائمًا طباعته؟ أو هل تريد الوصول إلى الخطوط المختلفة؟:

var splitted = input.Split(new [] { ','}, StringSplitOptions.RemoveEmptyEntries); 

var lines = from item in splitted.Select((part, i) => new { part, i })
            group item by item.i / 5 into g
            select string.Join(",", g.Select(a => a.part));

أو عن طريق هذا الرمز الكبير إلى حد ما. لكنني في كثير من الأحيان كنت بحاجة إلى طريقة "قطعة" لذلك قد تكون قابلة لإعادة الاستخدام. لا أعرف ما إذا كانت هناك طريقة "قطعة" - لا يمكن العثور عليها.

public static class LinqExtensions
{
    public static IEnumerable<IList<T>> Chunks<T>(this IEnumerable<T> xs, int size)
    {
        int i = 0;

        var curr = new List<T>();

        foreach (var x in xs)
        {
            curr.Add(x);

            if (++i % size == 0)
            {
                yield return curr;
                curr = new List<T>();
            }
        }
    }
}

الاستخدام:

var lines = input.Split(',').Chunks(5).Select(list => string.Join(",", list));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top