Мне нужно опустить вторую стоимость, равную 0, и перейти к следующей строке, где стоимость не равна 0 - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть таблица с двумя столбцами Описание и Стоимость. Мне нужно объединить вторую строку с первой, если Cost = 0, что я сделал. Тем не менее, если 3-я строка также имеет значение Cost = 0, мне нужно ее пропустить (здесь я терплю неудачу).

Я уже написал следующий код, и он работает, но он не пропускает вторую стоимость = 0 и перейти к следующей строке с Cost! = 0.

Я пытался с таймером, но он не работает. В то время как я также работаю над решением, кто-нибудь сможет помочь с тем, чего мне не хватает, пожалуйста?

    DataTable DT = new DataTable();
    DT.Columns.Add("Desc", typeof(string));
    DT.Columns.Add("Cost", typeof(int));

    DT.Rows.Add(new object[] { "Line 1", 200 });
    DT.Rows.Add(new object[] { "Line 2", 0 });
    DT.Rows.Add(new object[] { "Line 3", 0 });
    DT.Rows.Add(new object[] { "Line 4", 0 });
    DT.Rows.Add(new object[] { "Line 5", 500 });
    DT.Rows.Add(new object[] { "Line 6", 0 });
    DT.Rows.Add(new object[] { "Line 7", 0 });
    DT.Rows.Add(new object[] { "Line 8", 0 });
    DT.Rows.Add(new object[] { "Line 9", 0 });
    DT.Rows.Add(new object[] { "Line 10", 3500 });
    DT.Rows.Add(new object[] { "Line 11", 0 });

    DataTable dt2 = DT.Clone();

    string Desc = "";
    int Cost = 0;
    int newCost = 0;
    int rowNumber = 0;

    int counter = 0;
    foreach (DataRow row in DT.AsEnumerable())
    {
        string newDesc = row.Field<string>("Desc");
        newCost = row.Field<int>("Cost");

        if ((++rowNumber == 1) || (newCost == 0))
        {
            if (counter <= 2)//not working
            {
                Desc += " " + newDesc;
                counter = 0;
            }

            Cost += newCost;
        }
        else
        {
            dt2.Rows.Add(new object[] { Desc, Cost });
            Cost = newCost;
            Desc = newDesc;
        }
        counter++;
    }

    if (Cost != 0)
    {
        dt2.Rows.Add(new object[] { Desc, Cost });
    }

    foreach (DataRow a in dt2.Rows)
    {
        Console.WriteLine(a["Desc"] + " " + a["Cost"]);

        // Current result - not GOOD
        //Line 1 Line 2 Line 3 Line 4 200
        //Line 5 Line 6 Line 7 Line 8 Line 9 500
        //Line 10 Line 11 3500

        //The right result
        //Line 1 Line 2 200
        //Line 5 Line 6 500
        //Line 10 Line 11 3500
    }

1 Ответ

0 голосов
/ 25 апреля 2020

После тщательного анализа структуры алгоритмов c я решил проблему.

Спасибо всем за внимание.

DataTable DT = new DataTable();
    DT.Columns.Add("Desc", typeof(string));
    DT.Columns.Add("Cost", typeof(int));

    DT.Rows.Add(new object[] { "Line 1", 200 });
    DT.Rows.Add(new object[] { "Line 2", 0 });
    DT.Rows.Add(new object[] { "Line 3", 0 });
    DT.Rows.Add(new object[] { "Line 4", 0 });
    DT.Rows.Add(new object[] { "Line 5", 500 });
    DT.Rows.Add(new object[] { "Line 6", 0 });
    DT.Rows.Add(new object[] { "Line 7", 0 });
    DT.Rows.Add(new object[] { "Line 8", 0 });
    DT.Rows.Add(new object[] { "Line 9", 0 });
    DT.Rows.Add(new object[] { "Line 10", 3500 });
    DT.Rows.Add(new object[] { "Line 11", 0 });
    DT.Rows.Add(new object[] { "Line 12", 0 });

    DataTable dt2 = DT.Clone();

    string Desc = "";
    int Cost = 0;
    int newCost = 0;
    int rowNumber = 0;

    int counter = 0;
    foreach (DataRow row in DT.AsEnumerable())
    {
        string newDesc = row.Field<string>("Desc");
        newCost = row.Field<int>("Cost");

        if (newCost == 0)
            counter++;
        else
            counter = 0;

        if ((++rowNumber == 1) || (newCost == 0))
        {
            if (counter <= 1)
            {
                Desc += " " + newDesc;
                Cost += newCost;
            }
        }
        else
        {
            dt2.Rows.Add(new object[] { Desc, Cost });
            Cost = newCost;
            Desc = newDesc;
        }
    }

    if (Cost != 0)
    {
        dt2.Rows.Add(new object[] { Desc, Cost });
    }

    foreach (DataRow a in dt2.Rows)
    {
        Console.WriteLine(a["Desc"] + " " + a["Cost"]);

        //The right result
        //Line 1 Line 2 200
        //Line 5 Line 6 500
        //Line 10 Line 11 3500
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...