C# 检查列表1是否包含与另一个列表2的属性值相等的属性值

C# 检查列表1是否包含与另一个列表2的属性值相等的属性值,c#,linq,C#,Linq,我有两张单子 将插入数据库的新类别的列表 数据库中已存在的类别列表 公共类类别{ 公共字符串名称; } list dbCategories=新列表(新类别{Name=“John”},新类别{Name=“Daniel”},新类别{Name=“Matthew”}); list newCategories=新列表(新类别{Name=“John”},新类别{Name=“Rock”},新类别{“Daniel”}); 我想防止数据库中基于名称的重复 我从数据库中获取类别列表。现在要检查要插入的新类别列表在

我有两张单子

  • 将插入数据库的新类别的列表
  • 数据库中已存在的类别列表
  • 公共类类别{
    公共字符串名称;
    }
    list dbCategories=新列表(新类别{Name=“John”},新类别{Name=“Daniel”},新类别{Name=“Matthew”});
    list newCategories=新列表(新类别{Name=“John”},新类别{Name=“Rock”},新类别{“Daniel”});
    
    我想防止数据库中基于名称的重复

    我从数据库中获取类别列表。现在要检查要插入的新类别列表在数据库类别中是否有匹配的名称

    • 如果新类别在数据库类别列表中具有名称匹配,则我希望从要插入的新类别列表中删除该类别
    • 我想检索与名称匹配的项目,必须在第一个列表上进行第一次搜索,如果未找到匹配项,则应搜索第二个列表

    如何实现这一点?

    最简单的方法是使用简单的反向for循环,并删除类别列表中包含的每个项目。下面是一个小程序来说明这一点:

    void Main()
    {
        List<string> categories = new List<string>() { "cat1", "cat2", "cat3" };
        List<string> tobeinserted = new List<string>() {"cat14", "cat2", "cat34"};
    
        for (int i = tobeinserted.Count-1; i >= 0 ; i--)
        {
            if (categories.Contains(tobeinserted[i]))
            {
                tobeinserted.RemoveAt(i);
            }
        }       
        Console.WriteLine(string.Join(Environment.NewLine, tobeinserted));      
    }
    
    void Main()
    {
    列表类别=新列表(){“cat1”、“cat2”、“cat3”};
    List tobeinserted=新列表(){“cat14”、“cat2”、“cat34”};
    对于(int i=tobeinserted.Count-1;i>=0;i--)
    {
    if(类别包含(待插入[i]))
    {
    删除(i);
    }
    }       
    Console.WriteLine(string.Join(Environment.NewLine,tobeinserted));
    }
    
    输出为:

    cat14
    第34类

    要根据您的代码进行调整,循环可以如下所示:

    List<string> dbCategories_Names = dbCategories.Select(x => x.Name).ToList();
    
    for (int i = newCategories.Count-1; i >= 0 ; i--)
    {
        if (dbCategories_Names.Contains(newCategories[i].Name))
        {
            newCategories.RemoveAt(i);
        }
    }
    
    List dbCategories\u Name=dbCategories.Select(x=>x.Name.ToList();
    对于(int i=newCategories.Count-1;i>=0;i--)
    {
    if(dbCategories_Names.Contains(newCategories[i].Name))
    {
    新类别。删除(i);
    }
    }
    
    最简单的方法是使用简单的反向for循环,删除类别列表中包含的每个项目。下面是一个小程序来说明这一点:

    void Main()
    {
        List<string> categories = new List<string>() { "cat1", "cat2", "cat3" };
        List<string> tobeinserted = new List<string>() {"cat14", "cat2", "cat34"};
    
        for (int i = tobeinserted.Count-1; i >= 0 ; i--)
        {
            if (categories.Contains(tobeinserted[i]))
            {
                tobeinserted.RemoveAt(i);
            }
        }       
        Console.WriteLine(string.Join(Environment.NewLine, tobeinserted));      
    }
    
    void Main()
    {
    列表类别=新列表(){“cat1”、“cat2”、“cat3”};
    List tobeinserted=新列表(){“cat14”、“cat2”、“cat34”};
    对于(int i=tobeinserted.Count-1;i>=0;i--)
    {
    if(类别包含(待插入[i]))
    {
    删除(i);
    }
    }       
    Console.WriteLine(string.Join(Environment.NewLine,tobeinserted));
    }
    
    输出为:

    cat14
    第34类

    要根据您的代码进行调整,循环可以如下所示:

    List<string> dbCategories_Names = dbCategories.Select(x => x.Name).ToList();
    
    for (int i = newCategories.Count-1; i >= 0 ; i--)
    {
        if (dbCategories_Names.Contains(newCategories[i].Name))
        {
            newCategories.RemoveAt(i);
        }
    }
    
    List dbCategories\u Name=dbCategories.Select(x=>x.Name.ToList();
    对于(int i=newCategories.Count-1;i>=0;i--)
    {
    if(dbCategories_Names.Contains(newCategories[i].Name))
    {
    新类别。删除(i);
    }
    }
    
    您可以使用
    Where()
    Any()
    的组合,例如:

    var newEntries = newCategories.Where(n => !dbCategories.Any(d => d.Name == n.Name));
    

    否则,您可以考虑使用
    IEqualityComparer
    重载检查基于
    Name

    的相等性。您可以使用
    Where()
    Any()
    的组合,例如:

    var newEntries = newCategories.Where(n => !dbCategories.Any(d => d.Name == n.Name));
    

    否则,您可以考虑使用
    IEqualityComparer
    重载检查基于
    Name

    的相等性。如果
    Name
    是私有的,您打算如何访问它?你能改一下吗?我很久以前贴的这个问题,可能对你有用。这不是用c#写的,但我的想法和惯例已经被彻底讨论过了。如果
    Name
    是私有的,您打算如何访问它?你能改一下吗?我很久以前贴的这个问题,可能对你有用。这不是用c#写的,但我的想法和惯例已经被彻底讨论过了。