【问题标题】:Adding missing items to collection using LINQ使用 LINQ 将缺失项添加到集合
【发布时间】:2017-12-06 01:09:02
【问题描述】:

我有两个来自不同类的集合,它们具有这两个共同属性:

public class Class1
{
    public string ItemID {get;set;}
    public int sales {get;set;}
}

public class Class2 
{
    public string ItemID {get;set;}
}

现在这里发生了什么,我有两个具有这些类型的类的集合,如下所示:

List<Class1> list1; // has items that actually have sales...

List<Class1> list2; // has all items that have or don't have sales

list1 缺少根本没有销售的商品。我想在这里做的是通过itemID比较这两个列表,如果itemID缺失,那么我将把缺失的项目添加到list1,并将属性sales设置为0手动。

当找到丢失的物品时,我想这样做:

list1.Add(new Class1
{
    Sales = 0,
    ItemID = ItemID,
});

或者以其他方式添加缺失项并将其属性 sales 设置为 0...

谁能帮帮我?

编辑:

伙计们,我想我还有更多的解释要做......所以基本上如果 Class2 列表中的 ItemID 不存在于 Class1 列表中,那么它将添加到 Class1 列表中,属性“Sales”设置为 0....

【问题讨论】:

  • 你为什么告诉我们Class2这个类涉及到什么?
  • @Fabio 是的,因为它包含所有商品,有销售的商品和没有销售的商品... Class1 列表仅包含有销售商品的商品
  • Class2 拿着string
  • @KernelMode 是正确的 :)... 但是如果 Class2 列表中存在的 ItemID 在 Class1 列表中不存在,那么它的销售额设置为 0...

标签: c# asp.net asp.net-mvc linq c#-4.0


【解决方案1】:

你可以试试

var missingItems = 
    list2.Where(class2 => list1.Any(class1 => class1.ItemId == class2.ItemId) == false)
         .Select(class2 => new Class1 
         { 
             ItemId = class2.ItemId, 
             Sales = 0 
         });

list1.AddRange(missingItems);

为了更好地执行Where 子句,您可以创建HashSet&lt;string&gt; of list1

var existedIds = new HashSet<string>(list1.Select(class1 => class1.ItemId));
var missingItems = 
    list2.Where(class2 => existedIds.Contains(class2.ItemId) == false)
         .Select(class2 => new Class1 
         { 
             ItemId = class2.ItemId, 
             Sales = 0 
         }); 

list1.AddRange(missingItems);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    相关资源
    最近更新 更多