检查两个列表中的重复项

时间:2014-02-05 07:50:02

标签: c# asp.net list

我正在尝试使用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;
    }

4 个答案:

答案 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));

在您的情况下,sourceItemsitemListtargetItemsprodVariantDetail

DistictBy方法有不同的实现方式:

  1. 您可以从System.Linq应用Distinct LINQ。

  2. 使用自定义DistictBy方法(例如来自MoreLinq)。

  3. 您在这行代码中的问题:

    for (int i = 0; i < prodVariantIDList.Count; i++)
    {
        prodVariantDetail.Add(packBLL.getProdVariantDetailByID(prodVariantIDList[i]));
    }
    

答案 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();