繁体   English   中英

使用Linq在两个列表之间进行规范化的最佳方法是什么?

[英]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与客户端发布的标签匹配,而不在数据库中创建重复的标签。

您可以使用IntersectConcatExcept

a = a.Intersect(b).Concat(b.Except(a));

Intersect返回两个集合中都存在的项目,因此a.Intersect(b)将为您提供aba所有项目。

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);
}

最后, ab具有相同的元素。

但是,如果b有重复项,则需要小心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM