Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
230 views
in Technique[技术] by (71.8m points)

c# - 使用数据表对重复行的值求和(sum duplicate rows value using datatable)

i have DataTable which can have duplicate rows.

(我有可以有重复行的数据表。)

In the picture highlighted columns have all the same values.

(图片中突出显示的列具有相同的值。)

I would need to identify those rows and sum the salary( in original table is "jamekol").

(我需要标识这些行并加薪(在原始表中为“ jamekol”)。)

在此处输入图片说明

and i want to sum all duplicate Name's salary value like this :

(我想像这样将所有重复的Name的薪水总和求和:)

在此处输入图片说明

here is my orginal table :

(这是我的原始表:) 在此处输入图片说明 Note : i need all columns .

(注意:我需要所有列。)

Can anyone suggest how to do that?

(谁能建议该怎么做?)

DataTable new_Table = new DataTable();
                new_Table.Columns.Add("radif");
                new_Table.Columns.Add("sh_factor");
                new_Table.Columns.Add("t_factor");
                new_Table.Columns.Add("Taraf");
                new_Table.Columns.Add("m_taraf");
                new_Table.Columns.Add("mantaghe");
                new_Table.Columns.Add("jam");
                new_Table.Columns.Add("jamekol");
                new_Table.Columns.Add("m_kartkhan");
                new_Table.Columns.Add("m_takhfif");
                new_Table.Columns.Add("n_karbar");
                new_Table.Columns.Add("sh_sanad");
                new_Table.Columns.Add("code");
                new_Table.Columns.Add("m_tasvie");
                new_Table.Columns.Add("m_porsant");
                new_Table.Columns.Add("d_takhfif");
                new_Table.Columns.Add("m_maliat");
                new_Table.Columns.Add("m_avarez");
                new_Table.Columns.Add("n_taraf");
                new_Table.Columns.Add("v_moravede");
                var groupedByState = dt.AsEnumerable()
                    .GroupBy(r => r.Field<String>("Taraf"));
                foreach (var group in groupedByState)
                {
                    DataRow maxPremRow = group.OrderByDescending(r => r.Field<String>("Taraf")).First();
                    DataRow newRow = new_Table.Rows.Add();

                    newRow.SetField("id_po", group.Key);
                    newRow.SetField("Status", maxPremRow.Field<string>("Status"));
                    newRow.SetField("Cost_ex", group.Sum(r => r.Field<double?>("Cost_ex")));

                    newRow.SetField("Taraf", maxPremRow.Field<string>("Taraf"));
                    newRow.SetField("jamekol", group.Sum(r => r.Field<double?>("Cost_ex")));
                    newRow.SetField("radif", maxPremRow.Field<string>("radif"));
                    newRow.SetField("sh_factor", maxPremRow.Field<string>("sh_factor"));
                    newRow.SetField("t_factor", maxPremRow.Field<string>("t_factor"));
                    newRow.SetField("m_taraf", maxPremRow.Field<string>("m_taraf"));
                    newRow.SetField("mantaghe", maxPremRow.Field<string>("mantaghe"));
                    newRow.SetField("jam", maxPremRow.Field<string>("jam"));
                    newRow.SetField("m_kartkhan", maxPremRow.Field<string>("m_kartkhan"));
                    newRow.SetField("m_takhfif", maxPremRow.Field<string>("m_takhfif"));
                    newRow.SetField("n_karbar", maxPremRow.Field<string>("n_karbar"));
                    newRow.SetField("sh_sanad", maxPremRow.Field<string>("sh_sanad"));
                    newRow.SetField("code", maxPremRow.Field<string>("code"));
                    newRow.SetField("m_tasvie", maxPremRow.Field<string>("m_tasvie"));
                    newRow.SetField("m_porsant", maxPremRow.Field<string>("m_porsant"));
                    newRow.SetField("d_takhfif", maxPremRow.Field<string>("d_takhfif"));
                    newRow.SetField("m_maliat", maxPremRow.Field<string>("m_maliat"));
                    newRow.SetField("m_avarez", maxPremRow.Field<string>("m_avarez"));
                    newRow.SetField("n_taraf", maxPremRow.Field<string>("n_taraf"));
                    newRow.SetField("v_moravede", maxPremRow.Field<string>("v_moravede"));                       

                }
                radGridView3.DataSource = new_Table;
  ask by programmer translate from so

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
        DataTable dt = yourDataTableBefore();

        var query = from uu in dt.AsEnumerable()
                    select new
                    {
                        Name= uu.Field<string>("Name"),
                        Salary = uu.Field<string>("Salary"),
                        Date = uu.Field<string>("Date"),
                        Description = uu.Field<string>("Description"),
                    };
        var result = query.GroupBy(cc => cc.Name).Select(dd => new
        {
            Name = dd.Key,
            Salary = string.Join(",",
            dd.Select(ee => ee.Salary).ToList()),
            Date = dd.Select(ee => ee.Date),
            Description = dd.Select(ee => ee.Description),
        });

        DataTable dt_After = new DataTable();
        dt_After.Columns.Add("Name", typeof(string));
        dt_After.Columns.Add("Salary", typeof(string));
        dt_After.Columns.Add("Date", typeof(string));
        dt_After.Columns.Add("Description", typeof(string));

        foreach (var item in result.ToList())
        {
            var newRow = dt_After.NewRow();
            Array.ForEach(item.GetType().GetProperties(), p => newRow[p.Name] = p.GetValue(item, null));
            dt_After.Rows.Add(newRow);
        }
        foreach (DataRow row in dt_After.Rows)
        {
            List<string> List= row["Salary"].ToString().Split(',').ToList();
            string Sum_Salary = //Iterate through the list, convert them to int and sum it up;
            row["Salary"] = Sum_Salary;
        }

Gridview.DataSource = dt_After;
Gridview.DataBind();

You can do the sum at the "var query" (Like Random Stuff's answer) or use this long method (The data can be utilised later on).

(您可以在“变量查询”中进行求和(如Random Stuff的答案),也可以使用此较长的方法(以后可以使用数据)。)

Both will work.

(两者都会起作用。)

I leave the iteration part for you to figure it out (should be easy, your school work? :P).

(我将迭代部分留给您解决(您的功课应该很容易吗,:P)。)

Hope it helps, Best Regards.

(希望对您有帮助,最好的问候。)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...