C# 检查两个列表中的重复

C# 检查两个列表中的重复,c#,asp.net,list,C#,Asp.net,List,我试图使用C#中的LINQ查询检查两个列表中的重复ID。代码如下: List<DistributionStandardPackingUnitItems> itemList = new List<DistributionStandardPackingUnitItems>(); List<DistributionStandardPackingUnitItems> prodVariantDetail = new List<DistributionStandar

我试图使用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]);
            }
        }
List itemList=new List();
List prodVariantDetail=新列表();
私人名单
{
得到
{
if(ViewState[“tempDistSPUI”]==null)
{
返回新列表();
}
其他的
{
返回(列表)视图状态[“tempDistSPUI”];
}
}
设置
{
ViewState[“tempDistSPUI”]=值;
}
}
itemList=this.tempDistSPUI;
对于(int j=0;ji.id==itemList[j].id))
{
prodVariantDetail.Add(项目列表[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;
    }
protectedvoid lbnAdd\u单击(对象发送方,事件参数e)
{
List prodVariantDetail=新列表();
int packagesNeeded=prodPackBLL.getpackagesneedbydistributionid(distributionID);
//从ViewState获取最后一个产品变体ID
ProdVariantId=this.SelectedVariantDetailId;
foreach(RepeaterItem ri在Repeater1.项目中)
{
GridView gvProduct=(GridView)ri.FindControl(“gvProduct”);
foreach(gvProduct.Rows中的GridViewRow gr)
{
复选框cb=(复选框)gr.FindControl(“cbCheckRow”);
//防止储存重复产品
if(cb.Checked&!prodvariantilist.Any(i=>i==gvProduct.DataKeys[gr.RowIndex].Value.ToString())
{
//将相应的数据键添加到idList
添加(gvProduct.DataKeys[gr.RowIndex].Value.ToString());
}
}
}
for(int i=0;ii.id==tempDistSPUI[j].id))
{
prodVariantDetail.Add(tempDistSPUI[j]);
}
}
gvfinalized.DataSource=prodVariantDetail;
gvfinalized.DataBind();
foreach(GVFinalized.Rows中的GridViewRow gr)
{
//按产品名称获取产品包装数量
字符串名称=gr.Cells[1]。文本;
int productQuantity=packBLL.getProductQuantityByName(名称,distributionID);
TextBox tb=(TextBox)gr.Cells[5]。FindControl(“tbQuantity”);
如果(productQuantity==0)
{
tb.Text=productQuantity.ToString();
}
其他的
{
tb.Text=(productQuantity/PackagesRequired).ToString();
}
}
//将ProdVariantId列表保存到ViewState
this.selectedVariantDetailId=ProdVariantId列表;
}
您可以试试这个

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();
var-Gdupes=itemList.GroupBy(x=>new{x.ID}).Where(x=>x.Skip(1.Any()).ToList();
List dupes=Gdupes.SelectMany(x=>x.ToList();
prodVariantDetail=itemList.Exception(dupes.ToList();

代码未测试

以下是解决您问题的常见方法:

var toAdd = itemList.Where(i => !prodVariantDetail.Any(p => p.Id == i.Id));
var query = prodVariantDetail.Concat(toAdd);
targetItems.AddRange(sourceItems.DistictBy(item => item.Id));
在您的情况下,
sourceItems
itemList
targetItems
provariantdetail

DistictBy方法有不同的实现:

  • 您可以从System.LINQ应用LINQ

  • 使用自定义方法(例如,从)

  • 您在以下代码行中遇到的问题:

    for (int i = 0; i < prodVariantIDList.Count; i++)
    {
        prodVariantDetail.Add(packBLL.getProdVariantDetailByID(prodVariantIDList[i]));
    }
    
    for(int i=0;i
    如果特定ID重复,则可以使用GroupJoin

    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 toAdd=(从prodVariantDetail中的第一个开始)
    加入第二个项目列表
    在第一个上。Id等于第二个。Id
    比赛
    匹配的地方。Any()
    选择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();
    
    IEnumerable toAdd=(从prodVariantDetail中的第一个开始)
    加入第二个项目列表
    在第一个上。Id等于第二个。Id
    比赛
    匹配的地方。Any()
    选择新的{Id=first.Id,Name=first.Name}).ToList();
    
    您的代码不清楚,请在
    tempDistSPUI
    属性后更正代码好吗?复制问题可能与线程并发有关,您的LINQ正常。for块的
    中的代码正确避免了
    itemList
    中的重复,但是不清楚
    prodVariantDetail
    for
    块之前发生了什么。可能是
    prodVariantDetail
    for
    块之前已经包含重复项。@ekad prodVariantDetail正在从ProdId列表中获取数据,我从另一个gridview中检查该行。你能帮我看一下编辑过的部分吗?在将它添加到prodVariantDetail之前,我检查了prodIDList。所以我用这两行替换整个for循环?Linq很简洁,顺便说一句,循环中除了括号外只有三行。你能给我举个例子吗?因为我还是很困惑it@Gwen您可以通过以下链接找到示例,我提供了这些链接。顺便说一句,我更喜欢
    方法。但是在使用它之前,您应该进行代码重构,因为它既不可读也不可理解。只要试着将Click方法拆分为短方法,您就会发现项目重复的原因。所以我就用这个替换整个for循环?@Gwen是的,您呢