c# - 使用 LINQ 将缺失的项目添加到集合中

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

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

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....

最佳答案

你可以试试

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<string>的条款的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);

关于c# - 使用 LINQ 将缺失的项目添加到集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44874144/

相关文章:

c# - 使用 Fisher-Yates 算法后的随机字符串冲突 (C#)

asp.net - 将应用程序池空闲超时设置为 0 副作用

c# - 获取服务器上的硬件信息

asp.net - 'System.Data.SqlClient.SqlException : Login failed for user' error on asp. 网络核心 1 db 首先

c# - 在 Asp.Net MVC 5 中使用 Entity Framework 6 代码优先方法调用存储过程

c# - 命名空间如何在运行时加载类

c# - 不变文化

c# - asp.net 中登录页面的必填字段验证器

jquery - 在asp.net mvc中使用ajax发送Json数据数组和图像文件

javascript - 我可以在 ScriptBundle 中包含的 Javascript 中使用 Razor 语法吗?