LiNQ 中的 C# 数据表重复
C# Datatable Duplicate in LiNQ
我有一个包含 4 列的数据表:
Parent ID ID Qty Qty Type
A A12 5 xxx
B A32 10 xxx
A A12 4 xxx
A B23 3 yyy
最终结果应该是:
Parent ID ID Qty Qty Type
A A12 9 xxx
B A32 10 xxx
A B23 3 yyy
所以基本上逻辑应该是它会删除任何一组相同的 {Parent ID AND ID} 并向其中添加 Qty。在我们的示例中,第一个和第三个元素是相同的父 ID 和相同的 ID,因此我们删除第三个元素并将 Qty 添加到第一个元素(我们还必须检查 QTY Type 是否相同,如果不相同,我们必须删除一个错误)。
注意第 1 和第 4 没有被添加 - 因为他们的父 ID 可能相同但他们的父 ID + ID 不相同因此我们不添加。
有没有办法在 Linq 中做到这一点?不完全但主要是这样吗?
还没有测试过,但看看这是否有效...
void Main()
{
var lst = dt.Rows.OfType<DataRow>()
.GroupBy (r => r["Parent ID"].ToString() + "|" + r["ID"].ToString())
.Select (g => Record.GenerateRecord(g))
.ToList();
}
public class Record
{
public string ParentId { get; set; }
public string Id { get; set; }
public int Qty { get; set; }
public string QtyType { get; set; }
public static Record GenerateRecord(IGrouping<string, DataRow> grp)
{
var splt=grp.Key.Split('|');
var rec= new Record{Parent=splt[0], Id=splt[1], QtyType=grp.First()["Qty Type"].ToString()};
if (grp.Count()==1)
rec.Qty = int.Parse(grp.First()["Qty"].ToString());
else
rec.Qty = grp.Sum (g => int.Parse(g["Qty"].ToString()));
return rec;
}
}
我有一个包含 4 列的数据表:
Parent ID ID Qty Qty Type
A A12 5 xxx
B A32 10 xxx
A A12 4 xxx
A B23 3 yyy
最终结果应该是:
Parent ID ID Qty Qty Type
A A12 9 xxx
B A32 10 xxx
A B23 3 yyy
所以基本上逻辑应该是它会删除任何一组相同的 {Parent ID AND ID} 并向其中添加 Qty。在我们的示例中,第一个和第三个元素是相同的父 ID 和相同的 ID,因此我们删除第三个元素并将 Qty 添加到第一个元素(我们还必须检查 QTY Type 是否相同,如果不相同,我们必须删除一个错误)。
注意第 1 和第 4 没有被添加 - 因为他们的父 ID 可能相同但他们的父 ID + ID 不相同因此我们不添加。
有没有办法在 Linq 中做到这一点?不完全但主要是这样吗?
还没有测试过,但看看这是否有效...
void Main()
{
var lst = dt.Rows.OfType<DataRow>()
.GroupBy (r => r["Parent ID"].ToString() + "|" + r["ID"].ToString())
.Select (g => Record.GenerateRecord(g))
.ToList();
}
public class Record
{
public string ParentId { get; set; }
public string Id { get; set; }
public int Qty { get; set; }
public string QtyType { get; set; }
public static Record GenerateRecord(IGrouping<string, DataRow> grp)
{
var splt=grp.Key.Split('|');
var rec= new Record{Parent=splt[0], Id=splt[1], QtyType=grp.First()["Qty Type"].ToString()};
if (grp.Count()==1)
rec.Qty = int.Parse(grp.First()["Qty"].ToString());
else
rec.Qty = grp.Sum (g => int.Parse(g["Qty"].ToString()));
return rec;
}
}