C# 使用LINQ从2个集合中检索非重复项
背景:我有两个具有不同名称属性(两个字符串)的不同类型对象的集合。C# 使用LINQ从2个集合中检索非重复项,c#,linq,C#,Linq,背景:我有两个具有不同名称属性(两个字符串)的不同类型对象的集合。Collection1中的对象有一个名为Name的字段,Collection2中的对象有一个名为field的字段 我需要比较这两个属性,并从Collection1中获取项目,其中Collection2中没有基于该字符串属性的匹配项(Collection1将始终具有更多或相等数量的项目。完成后,所有项目都应在Collection2中按名称/字段进行匹配) 问题:我用列表找到了答案,它们帮了我一点忙(值得一提的是,我用的是集合)。我确
Collection1
中的对象有一个名为Name
的字段,Collection2
中的对象有一个名为field
的字段我需要比较这两个属性,并从
Collection1
中获取项目,其中Collection2
中没有基于该字符串属性的匹配项(Collection1
将始终具有更多或相等数量的项目。完成后,所有项目都应在Collection2
中按名称/字段进行匹配)
问题:我用列表找到了答案,它们帮了我一点忙(值得一提的是,我用的是集合)。我确实找到了适合我的方法,但是我想将我所做的工作从查询语法(如果它叫什么?)转换为LINQ查询。见下文:
//Query for results. This code is what I'm specifically trying to convert.
var result = (from item in Collection1
where !Collection2.Any(x => x.ColumnName == item.FieldName)
select item).ToList();
//** Remove items in result from Collection1**
//...
我对这两种语法都不太熟悉(正在研究),但我想我基本上理解了这两种语法的作用。不过,我正在努力将其转换为LINQ语法,我想学习这两个选项,而不是某种嵌套循环
从
Collection1
中删除查询结果后的最终目标:Collection1.Count==Collection2
,对于集合中的每个项目,以下情况都是正确的:ItemFromCollection1.Name==SomeItemFromCollection2.Field
(如果有意义的话…您的第一个查询与您要求的相反。它在寻找没有等价物的记录。以下内容将返回Collection1中存在等效项的所有记录:
var results=Collection1.Where(c1=>!Collection2.Any(c2=>c2.Field==c1.Name));
请注意,这不是最快的方法,特别是如果collection2中有大量记录。您可以通过哈希集或查找找到加快查询速度的方法。您的第一个查询与您要求的相反。它在寻找没有等价物的记录。以下内容将返回Collection1中存在等效项的所有记录:
var results=Collection1.Where(c1=>!Collection2.Any(c2=>c2.Field==c1.Name));
请注意,这不是最快的方法,特别是如果collection2中有大量记录。您可以通过哈希集或查找找到加速的方法。您可以将其转换为LINQ方法,如下所示:
var result = Collection1.Where(item => !Collection2.Any(x => x.ColumnName == item.FieldName))
.ToList();
您可以将其转换为LINQ方法,如下所示:
var result = Collection1.Where(item => !Collection2.Any(x => x.ColumnName == item.FieldName))
.ToList();
如果要获得要保留的非重复值列表,请执行以下操作
List<string> listNonDup = new List<String>{"6","1","2","4","6","5","1"};
var singles = listNonDup.GroupBy(n => n)
.Where(g => g.Count() == 1)
.Select(g => g.Key).ToList();
如果要获得要保留的非重复值列表,请执行以下操作
List<string> listNonDup = new List<String>{"6","1","2","4","6","5","1"};
var singles = listNonDup.GroupBy(n => n)
.Where(g => g.Count() == 1)
.Select(g => g.Key).ToList();
你说得对。我会努力清理我的帖子。我所做的是找到不匹配的,然后在以后的时间删除它们。这是我的错误沟通。您将要更改为…
c1=>!收藏2.任何
。。。以获得非重复性。我并不担心大量的唱片。平均应该在15英寸左右。肯定不会超过100个左右。编辑的答案反映了获得非重复而不是重复。你是对的。我会努力清理我的帖子。我所做的是找到不匹配的,然后在以后的时间删除它们。这是我的错误沟通。您将要更改为…c1=>!收藏2.任何
。。。以获得非重复性。我并不担心大量的唱片。平均应该在15英寸左右。绝对不超过100个左右。编辑的答案反映了获得非重复而不是重复。真棒,工作完美。现在我只需要将它与另一个进行比较……太棒了,效果非常好。现在我只需要把它和另一个做比较。。。