C# c-汇总数据表中的重复行

C# c-汇总数据表中的重复行,c#,C#,我有一个表,我想汇总重复的行: |name | n | |name | n | |------+---| |------+---| |leo | 1 | |leo | 3 | |wayne | 1 | |wayne | 2 | |joe | 1 | |joe | 1 | |wayne | 1 | |leo | 1 | |leo | 1 | ArrayList UniqueRecords = new ArrayList();

我有一个表,我想汇总重复的行:

|name  | n |   |name  | n |
|------+---|   |------+---|
|leo   | 1 |   |leo   | 3 |
|wayne | 1 |   |wayne | 2 |
|joe   | 1 |   |joe   | 1 |
|wayne | 1 |
|leo   | 1 |
|leo   | 1 |
        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }
我可以这样删除它,但是如何总结呢

        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }

这就是你用字典做这件事的方法。基本上,创建一个从名称到DataRow对象的字典,然后汇总DataRows的n属性:

        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }
// create intermediate dictionary to group the records
Dictionary<string, DataRow> SummarizedRecords = new Dictionary<string, DataRow>();

// iterate over all records 
foreach(DataRow dRow in table.Rows)
{
  // if the record is in the dictionary already -> sum the "n" value
  if(SummarizedRecords.ContainsKey(dRow["name"]))
  {
    SummarizedRecords[dRow["name"]].n += dRow["n"];
  }
  else
  {
    // otherwise just add the element
    SummarizedRecords[dRow["name"]] = dRow;
  }
}

// transform the dictionary back into a list for further usage
ArrayList<DataRow> summarizedList = SummarizedRecords.Values.ToList();
我认为这可以通过LINQ的一行代码更优雅地完成。让我再想想:

        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }
编辑

        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }
这是一个Linq版本,但是它涉及到创建新的DataRow对象,这可能不是您的意图-不知道:

        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }
ArrayList<DataRow> summarizedRecords = table.Rows.GroupBy(row => row["name"]) // this line groups the records by "name"
              .Select(group => 
                      {
                        int sum = group.Sum(item => item["n"]);  // this line sums the "n"'s of the group
                        DataRow newRow = new DataRow();  // create a new DataRow object
                        newRow["name"] = group.Key;      // set the "name" (key of the group)
                        newRow["n"] = sum;               // set the "n" to sum
                        return newRow;                   // return that new DataRow
                      })
              .ToList();     // make the resulting enumerable a list

感谢您的回复,另一种变体:

        ArrayList UniqueRecords = new ArrayList();
        ArrayList DuplicateRecords = new ArrayList();

        foreach (DataRow dRow in table.Rows)
        {
            if (UniqueRecords.Contains(dRow["name"]))
                DuplicateRecords.Add(dRow);
            else
                UniqueRecords.Add(dRow["name"]);
        }

        foreach (DataRow dRow in DuplicateRecords)
        {
            table.Rows.Remove(dRow);
        }
var result = from row in table.AsEnumerable()
                             group row by row.Field<string>("Name") into grp
                             select new
                             {
                                 name = grp.Key,
                                 n = grp.Count()
                             };

你所说的总结是什么意思?您想要什么类型的输出/数据?我想要第二个表中的“n”列的总和