2016-06-10 28 views
0

我有两个列表对象,如如何从c#中的两个列表中获取唯一的对象?

list1 =[{"id":"101","name":"one"},{"id":"102","name":"two"},{"id":"103","name":"three"}] 
list2 =[{"id":"111","name":"one"},{"id":"112","name":"two"},{"id":"114","name":"four"},{"id":"115","name":"five"}] 

在上述两个列表包含重复的名称值。现在我想根据name属性获取唯一的名称对象。 输出: -

result =[{"id":"103","name":"three"},{"id":"114","name":"four"},{"id":"115","name":"five"}] 
+1

您显示JSON语法,但已标记您的问题C#。你能详细说明这些是C#还是JSON列表,以及你试图解决这个问题? – CodeCaster

+0

您可以连接2个列表,然后'GroupBy(x => x.name)'并获取'Count == 1'的值,但如果您的对象具有'IEqualityComparer',则还有其他替代方法, .Except()'和'.Union()' –

回答

1

你可以使用Linq扩展功能,做到这一点。

var result = list1.Concat(list2) 
    .GroupBy(x=>x.name) 
    .Where(x=>x.Count() == 1) 
    .Select(x=>x.FirstOrDefault()) 
    .ToList();  
+0

谢谢你@Hari Prasad。它的工作正常 –

0
var common = list1.Select(a => a.name).Intersect(list2.Select(b => b.name)); 
+0

这只是选择名称属性(OP想要的对象) –

0

假设你有JSON反序列化过程后,模型的列表:

var list1 = new List<Model>(); 
var list2 = new List<Model>(); 

既然你需要删除每个列表相交的所有元素,并返回独特的元素,使用除或removeall过:

var target = list1.Except(list2); 

// or use: 
var target = list1.RemoveAll(item => list2.Contains(item)); 

另一种方法使用的HashSet:

var hashSet = new HashSet<Model>(list2); 
list1.RemoveAll(item => hashSet.Contains(item)); 

参考:Remove elements from one List<T> that are found in another

相关问题