LINQ DataTable选择不同的行

Vin*_*pin 3 c# linq

我试图获得每个重复行的总和的不同行

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);
Run Code Online (Sandbox Code Playgroud)

我希望结果如此

 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
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ter 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);
Run Code Online (Sandbox Code Playgroud)

请注意,这不是一个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);
Run Code Online (Sandbox Code Playgroud)

你需要添加using System.Linq;.