[英]What's the best way to normalize between two lists using Linq?
给定C#中的两个IEnumerable实例(分别称为a和b),最好的方法是删除a中所有不在b中的值,然后将b中所有不在a中的值相加?
我知道我通常可以设置a = b,但这最终是为了通过MVC应用程序中的Entity Framework CodeFirst持久存储到数据库,因此需要警惕。 实际上,我们正在谈论根据客户端发布的内容更新记录。
似乎最接近的工作涉及foreach循环,一个循环访问“ a”列表并填充“待删除的项目”的集合,另一个循环访问“ b”列表以标识“要添加的项目”,然后分别在“要删除的项目”和“要添加的项目”集合中分别添加和删除项目(因为在迭代时无法修改“ a”集合)。
但是,这感觉很笨拙。 有没有更好的办法?
更新为清楚起见,我将举一个例子。 假设我有一个从数据库中获取的实体,该实体代表一个博客Post(因为该示例永远不会感到疲倦...),并且说Post具有标签的集合。 从客户端,我得到了一个标签列表,这些标签现在应该是标签的“规范”列表,但是它们都不是实体,它只是一个内存中的集合。 我要做的是确保Post.Tags与客户端发布的标签匹配,而不在数据库中创建重复的标签。
您可以使用Intersect
, Concat
和Except
:
a = a.Intersect(b).Concat(b.Except(a));
Intersect
返回两个集合中都存在的项目,因此a.Intersect(b)
将为您提供a
和b
中a
所有项目。
Except
返回第一个集合中的元素,但不返回另一个集合中的元素,因此b.Except(a)
返回b
但不在a
元素。
Concat
将这两个集合连接在一起。
但是我真的没有收到您的问题,所以我不确定这不是您要的内容。
听起来您的可枚举a
实际上是一个列表,所以我这样做是这样的:
var a = new List<int>() { 1, 2, 3, };
var b = new List<int>() { 1, 3, 4, 5, };
foreach (var x in a.Except(b).ToArray())
{
a.Remove(x);
}
foreach (var x in b.Except(a).ToArray())
{
a.Add(x);
}
最后, a
与b
具有相同的元素。
但是,如果b
有重复项,则需要小心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.