3

我正在尝试使用每个重复行的总和来获得不同的行

DataTable newItems = new DataTable();

newItems.Columns.Add("Qty");
newItems.Columns.Add("BarcodeNumber");
newItems.Columns.Add("DisplayName");
newItems.Columns.Add("UnitPrice");
newItems.Columns.Add("TotalPrice");

newItems.Rows.Add(1, "URT29384", "Wallet", 88.8, 88.8);
newItems.Rows.Add(1, "URT29233", "Mouse", 4.44, 4.44);
newItems.Rows.Add(1, "URT29756", "Flash Drive", 1.47, 1.47);
newItems.Rows.Add(1, "URT29323", "Spoon", 99.95, 99.95);
newItems.Rows.Add(1, "URT29384", "Wallet", 88.8, 88.8);
newItems.Rows.Add(1, "URT29384", "Wallet", 88.8, 88.8);

我希望结果是

 3 URT29384  Wallet       266.4     266.4
 1 URT29233  Mouse          4.44      4.44
 1 URT29756  Flash Drive    1.47      1.47
 1 URT29323  Spoon         99.95     99.95

这可能使用 LINQ 吗?这里有点帮助.. TYIA

4

3 回答 3

6

是的,您可以使用Enumerable.GroupBy

var result = newItems.AsEnumerable()
            .GroupBy(r => r.Field<String>("BarcodeNumber"))
            .Select(g => new { 
                Qty = g.Count(),
                BarcodeNumber = g.Key,
                DisplayName = g.First().Field<String>("DisplayName"),
                UnitPrice = g.Sum(r => r.Field<double>("UnitPrice")),
                TotalPrice = g.Sum(r => r.Field<double>("TotalPrice")),
            })
            .OrderByDescending(x => x.Qty);

请注意,这不是您的列的匿名类型DataTableIEnumerable<DataRow>而是匿名类型。如果需要,您将需要使用 foreach 循环将真实的 DataRows 添加到另一个 DataTable。

foreach (var grp in result)
    Console.WriteLine("Qty:{0} BarcodeNumber:{1} DisplayName:{2} UnitPrice:{3} TotalPrice:{4}"
        , grp.Qty, grp.BarcodeNumber, grp.DisplayName, grp.UnitPrice, grp.TotalPrice);

您需要添加using System.Linq;.

于 2012-10-04T08:36:54.373 回答
1

是的,有可能

var foo = newItems.AsEnumerable()
    .GroupBy(item => item.Field<string>(newItems.Columns["BarcodeNumber"]));

DataTable newTable = new DataTable();

newTable.Columns.Add("Qty");
newTable.Columns.Add("BarcodeNumber");
newTable.Columns.Add("DisplayName");
newTable.Columns.Add("UnitPrice");
newTable.Columns.Add("TotalPrice");

foreach (var item in foo)
{
    newTable.Rows.Add(
    item.Count(),
    item.Key,
    item.First().Field<string>(newItems.Columns["DisplayName"]),
    item.Sum(row => decimal.Parse(row.Field<string>(newItems.Columns["UnitPrice"]))),
    item.Sum(row => decimal.Parse(row.Field<string>(newItems.Columns["TotalPrice"]))));
}
于 2012-10-04T08:44:14.717 回答
1
private static DataTable GetUniqueEntries(DataTable dt)  
    {  
        var query = (  
        from row in dt.AsEnumerable()  
        select row.Field<string>("UserName")).Distinct();  //any column <UserName>

        DataTable dtDistinctNames = new DataTable();  
        dtDistinctNames.Columns.Add("UserName", typeof(string));  

        //have to return a datatable, thus loop through entries  
        foreach (string item in query)  
        {  
            DataRow newRow = dtDistinctNames.NewRow();  
            newRow["UserName"] = item;  
            dtDistinctNames.Rows.Add(newRow);  
        }  

        return dtDistinctNames;  
    }
于 2013-01-22T09:26:51.857 回答