我正在尝试使用每个重复行的总和获得不同的行
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
答案 0 :(得分: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);
请注意,这不是DataTable
或IEnumerable<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;
。
答案 1 :(得分: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"]))));
}
答案 2 :(得分: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;
}