我有以下DataTable和复合主键。第4次通过for循环,将违反复合密钥。怎么说,如果这一行会导致密钥被违反,不要将它添加到DataRowCollection中?我只想在我的DataTable中根据三个键唯一的行。感谢
DataTable DTRejects = new DataTable("RejectedInvoicesDT");
DTRejects.PrimaryKey = new DataColumn[]
{
DTRejects.Columns.Add("OperatorName"),
DTRejects.Columns.Add("ProcessType"),
DTRejects.Columns.Add("RejectedReason")
};
for (int i = 0; i < RowIndex; i++)
{
if (arrStatus[i].ToString() == "Rejected")
{
DataRow DRRejects = DTRejects.NewRow();
DRRejects[0] = arrOperatorName[i].ToString();
DRRejects[1] = arrProcessType[i].ToString();
DRRejects[2] = arrRejectedReason[i].ToString();
DTRejects.Rows.Add(DRRejects);
}
}
答案 0 :(得分:0)
应用逻辑上不同的先验。使用LINQ和Distinct
很容易。
例如:
var statuses = Range(0, RowIndex)
.Where(i => "Rejected".Equals(arrStatus[i]))
.Select(i => new {
OperatorName = Convert.ToString(arrOperatorName[i]),
ProcessType = Convert.ToString(arrProcessType[i]),
RejectedReason = Convert.ToString(arrRejectedReason[i]),
})
.Distinct();
foreach (var status in statuses)
{
dtRejects.Rows.Add(new object [] {
status.OperatorName, status.ProcessType, status.RejectedReason
});
}
答案 1 :(得分:0)
您正在使用DataTable的泛型类型,但如果您创建一个Strong Typed数据集,您也可以使用设计器创建强类型DataTable。
在强类型数据表上,您可以使用设计器定义主键。 您可以启用或禁用约束检查。 根据主键值的值,您可以使用易于使用的find方法查看表。
因此,很容易检测到密钥是否已经存在。 当然使用linq这也很容易,因为user2864740在他的回答中指出,但我在linq存在之前已经使用了强类型数据集,并且它们也起作用,结果是非常易读的代码。