我有两个收藏a
and b
。我想计算其中的一组项目a
or b
,但不能同时存在(逻辑异或)。有了 LINQ,我可以想出这个:
IEnumerable<T> Delta<T>(IEnumerable<T> a, IEnumerable<T> b)
{
return a.Except (b).Union (b.Except (a));
}
我想知道是否还有其他更有效或更紧凑的方法来产生两个集合之间的差异。
编辑 1:Jon Skeet 发布了第一个解决方案,该解决方案不依靠依赖来保留项目的顺序HashSet
。我想知道是否还有其他方法可以保留顺序a
and b
在输出中。
Use HashSet<T>
直接 - 它有一个SymmetricExceptWith
method:
HashSet<T> data = new HashSet<T>(a);
data.SymmetricExceptWith(b);
编辑:如果您想维持顺序,这里有一个替代方案:
HashSet<T> data = new HashSet<T>(a);
data.IntersectWith(b);
foreach (T t in a.Concat(b))
{
if (!data.Contains(t))
{
yield return t;
}
}
这有以下重要区别:
那还只是two设置操作而不是原始代码中的三个操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)