【发布时间】:2014-02-05 07:50:02
【问题描述】:
我正在尝试使用 C# 中的 LINQ 查询检查两个列表中的重复 ID。代码如下:
List<DistributionStandardPackingUnitItems> itemList = new List<DistributionStandardPackingUnitItems>();
List<DistributionStandardPackingUnitItems> prodVariantDetail = new List<DistributionStandardPackingUnitItems>();
private List<DistributionStandardPackingUnitItems> tempDistSPUI
{
get
{
if (ViewState["tempDistSPUI"] == null)
{
return new List<DistributionStandardPackingUnitItems>();
}
else
{
return (List<DistributionStandardPackingUnitItems>)ViewState["tempDistSPUI"];
}
}
set
{
ViewState["tempDistSPUI"] = value;
}
}
itemList = this.tempDistSPUI;
for (int j = 0; j < itemList.Count; j++)
{
if (!prodVariantDetail.Any(i => i.id == itemList[j].id))
{
prodVariantDetail.Add(itemList[j]);
}
}
但是,prodVariantDetail 列表仍然包含重复的 ID。我想知道是否还有其他 LINQ 查询,例如 Where to fix this?提前致谢。
编辑
protected void lbnAdd_Click(object sender, EventArgs e)
{
List<DistributionStandardPackingUnitItems> prodVariantDetail = new List<DistributionStandardPackingUnitItems>();
int packagesNeeded = prodPackBLL.getPackagesNeededByDistributionID(distributionID);
// get the last product variant IDs from ViewState
prodVariantIDList = this.SelectedVariantDetailIDs;
foreach (RepeaterItem ri in Repeater1.Items)
{
GridView gvProduct = (GridView)ri.FindControl("gvProduct");
foreach (GridViewRow gr in gvProduct.Rows)
{
CheckBox cb = (CheckBox)gr.FindControl("cbCheckRow");
//Prevent gvFinalised to store duplicate products
if (cb.Checked && !prodVariantIDList.Any(i => i == gvProduct.DataKeys[gr.RowIndex].Value.ToString()))
{
// add the corresponding DataKey to idList
prodVariantIDList.Add(gvProduct.DataKeys[gr.RowIndex].Value.ToString());
}
}
}
for (int i = 0; i < prodVariantIDList.Count; i++)
{
prodVariantDetail.Add(packBLL.getProdVariantDetailByID(prodVariantIDList[i]));
}
//Check if itemList and prodVariantDetail list contains any duplicate records
for (int j = 0; j < tempDistSPUI.Count; j++)
{
if (!prodVariantDetail.Any(i => i.id == tempDistSPUI[j].id))
{
prodVariantDetail.Add(tempDistSPUI[j]);
}
}
gvFinalised.DataSource = prodVariantDetail;
gvFinalised.DataBind();
foreach (GridViewRow gr in gvFinalised.Rows)
{
//Get the product packaging quantity by productName
string name = gr.Cells[1].Text;
int productQuantity = packBLL.getProductQuantityByName(name, distributionID);
TextBox tb = (TextBox)gr.Cells[5].FindControl("tbQuantity");
if (productQuantity == 0)
{
tb.Text = productQuantity.ToString();
}
else
{
tb.Text = (productQuantity / packagesNeeded).ToString();
}
}
// save prodVariantIDList to ViewState
this.SelectedVariantDetailIDs = prodVariantIDList;
}
【问题讨论】:
-
您的代码不清楚,能否请您在
tempDistSPUI属性后面更正您的代码? -
重复的问题可能和线程并发有关,你的LINQ没问题。
-
for块内的代码正确地避免了来自itemList的重复,但尚不清楚prodVariantDetail在for块之前会发生什么。prodVariantDetail可能在for块之前已经包含重复项。 -
@ekad prodVariantDetail 正在从 prodIDList 中获取数据,我从另一个 gridview 检查行。你介意帮我看看编辑过的部分吗?
-
在将 prodIDList 添加到 prodVariantDetail 之前,我对其进行了检查。