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#写的,但我的想法和惯例已经被彻底讨论过了。