【问题标题】:C# Datatable Duplicate in LiNQLiNQ中的C#数据表重复
【发布时间】:2015-06-24 16:01:41
【问题描述】:

我有一个包含 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} 集并将数量添加到它。在我们的示例中,第一个和第三个元素是相同的父 ID 和相同的 ID,因此我们删除第 3 个元素并将数量添加到第一个元素(我们还必须检查数量类型是否相同,否则我们必须射出一个错误)。

注意第一个和第四个没有被添加 - 因为他们的父 ID 可能相同,但他们的父 ID + ID 不相同,因此我们不添加。

有没有办法在 Linq 中做到这一点?不完全是,但主要是这样?

【问题讨论】:

  • 你尝试了什么?
  • var dups = from row in _positionTable.Copy().AsEnumerable() group row by new { SubsystemTypeId = row.Field<string>("Parent ID"), SupplierId = row.Field<string>("ID") } into grp where grp.Count() > 1 select grp.Key;

标签: c# linq datatable datarow


【解决方案1】:

还没有测试,但看看这是否有效......

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;
    }
}

【讨论】:

  • @lynx...你收到错误了吗?能否请您发布为什么它没有成功....我没有测试代码...只是输入它:-)
  • 不,我没有收到错误,只是没有删除重复项,哈哈……不用担心,我制作了脚本,这样当它添加时,它会确保如果有这样的元素父 ID 和 ID 然后将其相加,否则放入数量。它似乎工作。非常感谢您的努力:D
  • 感谢@lynx 让我知道...原始列表实际上不重复的任何可能性(父 ID 或 ID 中的尾随空格)?有机会我会试试的……
猜你喜欢
  • 2014-01-09
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多