我正在尝试使用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查询,如何解决这个问题?提前谢谢。
修改
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;
}
答案 0 :(得分:2)
var toAdd = itemList.Where(i => !prodVariantDetail.Any(p => p.Id == i.Id));
var query = prodVariantDetail.Concat(toAdd);
答案 1 :(得分:0)
你可以试试这个
var Gdupes= itemList.GroupBy(x => new {x.ID}).Where(x => x.Skip(1).Any()).ToList();
List<DistributionStandardPackingUnitItems> dupes = Gdupes.SelectMany(x => x).ToList();
prodVariantDetail= itemList.Except(dupes).ToList();
未经过测试的代码
答案 2 :(得分:0)
以下是您的问题的常见解决方案:
targetItems.AddRange(sourceItems.DistictBy(item => item.Id));
在您的情况下,sourceItems
为itemList
而targetItems
为prodVariantDetail
。
DistictBy方法有不同的实现方式:
答案 3 :(得分:0)
您可以使用GroupJoin来复制特定ID
IEnumerable<DistributionStandardPackingUnitItems> toAdd = (from first in prodVariantDetail
join second in itemList
on first.Id equals second.Id
into matches
where matches.Any()
select first).ToList();
或者您可以使用
之类的投影IEnumerable<DistributionStandardPackingUnitItems> toAdd = (from first in prodVariantDetail
join second in itemList
on first.Id equals second.Id
into matches
where matches.Any()
select new {Id=first.Id,Name=first.Name}).ToList();