سؤال

وجدت هذا السؤال في مسألة قديمة في موقع الويب الخاص بك حتى ظننت أنني يمكن أن تفعل ذلك ولكن أعتقد أنني كنت مخطئا :-)

القديم بعد هنا

أنا جديد في خشنة مجموعة الشيء بحيث لا البرمجية التالية

StreamReader rows = new StreamReader("c:\\practice.txt");
            string line;
            int i;
            i=1;
            while ((line = rows.ReadLine()) != null)
            {
                String[][]rows = new String [i][]; ;
                rows = rows.ReadLine();
                String[][] rows = new string[S.Length][];
                i++;
            }
            for (int i; i < S.Length; i++)
            {

                row[i] = S[I].Split(',');

            }

            int totalCounter = 0, totalSum = 0;
            // etc
            foreach(string[] row in rows)
            {    
                int m1 = int.Parse(row[3]);
                totalCounter++;
                totalSum += m1;
                switch(row[2])
                {        
                    case "male":
                    maleCount++;            
                    maleSum += m1;            
                        break;        
                    case "female":            
                        femaleCount++;            
                        femaleSum += m1;            
                        break;    
                }
            }

أنا أعلم أنني فعلت أخطاء كبيرة ولكن في الشرق حاولت أن أي واحد يساعدني لجعلها تعمل مدونة

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

المحلول

يبدو لك أن تكون مزدوجة-قراءة السطور, أو ربما كنت قد اختلطت الصفوف والخلايا - هذا الشيء على وجه الخصوص يبدو حقا الغريب:

        while ((line = rows.ReadLine()) != null)
        {
            String[][]rows = new String [i][]; ;
            rows = rows.ReadLine();
            String[][] rows = new string[S.Length][];
            i++;
        }

أيإعادة إعلان الصفوف ، مكالمتين ReadLine في حلقة ، إلخ.أظن تقصد string.Split?وفي كلتا الحالتين إما استخدام File.ReadAllLines, أو ننظر في بعض من الخيارات التي عرضت أمس.إذا كنت في حاجة ماسة إلى استخدام المصفوفات الأساسية قد تبدو شيئا مثل:

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string[] lines = File.ReadAllLines("foo.txt");
        string[][] grid = new string[lines.Length][];
        for (int i = 0; i < lines.Length; i++)
        {
            grid[i] = lines[i].Split(',');
        }

        int totalCount = 0, maleCount = 0, femaleCount = 0,
            m1Total = 0, m2Total = 0, m3Total = 0,
            m1MaleTotal = 0, m1FemaleTotal = 0;
        foreach (string[] line in grid)
        {
            totalCount++;
            int m1 = int.Parse(line[3]),
                m2 = int.Parse(line[4]),
                m3 = int.Parse(line[5]);
            m1Total += m1;
            m2Total += m2;
            m3Total += m3;
            switch (line[1].Trim())
            {
                case "male":
                    maleCount++;
                    m1MaleTotal += m1;
                    break;
                case "female":
                    femaleCount++;
                    m1FemaleTotal += m1;
                    break;
            }
        }
        Console.WriteLine("Rows: " + totalCount);
        Console.WriteLine("Total m1: " + m1Total);
        Console.WriteLine("Average m1: " + ((double)m1Total)/totalCount);
        Console.WriteLine("Male Average m1: " + ((double)m1MaleTotal) / maleCount);
        Console.WriteLine("Female Average m1: " + ((double)m1FemaleTotal) / femaleCount);
    }
}

مرة أخرى أنا لا أستطيع أن أؤكد بما فيه الكفاية كم يجب أن تفعل هذا مع LINQ بدلا من دليل حلقات...

نصائح أخرى

أولا، تأكد من التفاف الموارد غير المدارة مثل تيارات في استخدام البيانات.

وأنا شخصيا أحب بلدي LineReader الطبقة مما يجعل من السهل قراءة أسطر من النص من ملف (أو أي شيء آخر، في الواقع).

وبعد ذلك، يهمني تجنب استخدام المصفوفات إلا إذا كان لديك حقا. List<T> عموما الكثير أكثر متعة للعمل مع. الآن إذا string.Split يفعل ما تريد، هل يمكن أن يكون List<String[]> بسهولة. بدلا من ذلك، وربما يمكنك القيام بالكثير من العمل باستخدام LINQ:

var query = from line in new LineReader("c:\\practice.txt")
            let parts = line.Split(',')
            select new { Gender=parts[2], Amount=int.Parse(parts[3]) };

وأخذ مجاميع متعددة من دفق بيانات واحد هو صعب في "طبيعية" LINQ (وهذا هو السبب مارك Gravell وأنا وضعت على دفع LINQ ). ومع ذلك، يمكنك استخدام عبارة foreach العادي:

int totalCounter = 0, totalSum = 0;
int maleCount = 0, maleSum = 0, femaleCount = 0, femaleSum = 0;
foreach (var row in query)
{
    totalCounter++;
    totalSum += row.Amount;
    switch (row.Gender)
    {
        case "male":
            maleCount++;
            maleSum += Amount;
            break;
        case "female":
            femaleCount++;
            femaleSum += Amount;
            break;
    }
}

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

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