C# 是否有LINQ等效方法?
我知道林克有办法。此方法确保每个集合中的每个项值以相同的顺序匹配 我想要的是一种更“等效”的功能。只是这两个序列包含相同的项,不一定顺序相同 例如,nUnit有C# 是否有LINQ等效方法?,c#,.net,linq,C#,.net,Linq,我知道林克有办法。此方法确保每个集合中的每个项值以相同的顺序匹配 我想要的是一种更“等效”的功能。只是这两个序列包含相同的项,不一定顺序相同 例如,nUnit有CollectionAssert.AreEqual()和CollectionAssert.AreEqual(),它们完成了我要解释的内容 我知道我可以通过以下方式实现: 提前对列表排序并使用SequenceEquals 使用相交,然后查看相交是否等于原始序列 例如: var source = new[] {5, 6, 7}; source
CollectionAssert.AreEqual()
和CollectionAssert.AreEqual()
,它们完成了我要解释的内容
我知道我可以通过以下方式实现:
SequenceEquals
相交
,然后查看相交是否等于原始序列var source = new[] {5, 6, 7};
source.Intersect(new[] {5, 7, 6}).Count() == source.Length;
您可以构建一个集合,然后使用。严格来说,它并不在LINQ内部,但它与LINQ配合得很好:) 当然,您可以轻松编写自己的扩展方法来扩展它。大概是这样的:
public static bool SetEquals<T>(this IEnumerable<T> source, IEnumerable<T> other)
{
HashSet<T> hashSet = new HashSet<T>(source);
return hashSet.SetEquals(other); // Doesn't recurse! Calls HashSet.SetEquals
}
publicstaticboolsetequals(此IEnumerable源,IEnumerable其他)
{
HashSet HashSet=新的HashSet(源);
返回hashSet.SetEquals(其他);//不递归!调用hashSet.SetEquals
}
编辑:如注释中所述,这忽略了元素出现的次数以及顺序-因此
{1,2}
将“设置为等于”{1,2,1,2,1,1}
。如果这不是您想要的,它会变得更复杂一些。我会创建一个扩展方法来进行相交,然后比较计数。我是这样做的:
public static bool SetEquivalent<T>(
this IEnumerable<T> aSet,
IEnumerable<T> anotherSet)
{
var diffA = aSet.Except(anotherSet).Count();
var diffB = anotherSet.Except(aSet).Count();
return diffA == diffB && diffA == 0;
}
publicstaticboolsetequivalent(
这是一个数不清的aSet,
IEnumerable(其他集合)
{
var diffA=aSet.Except(anotherSet.Count();
var diffB=anotherSet.Except(aSet.Count();
返回diffA==diffB&&diffA==0;
}
那么1,2将“等于”1,1,1,2,2?@spender:对于集合相等,这是正确的。每个集合中的元素集是相同的。但是值得强调的是,will edit.Jon,有时在这样的方法中,我无法决定是按您的方式编写它,还是执行类似于HashSet HashSet=source as HashSet??新哈希集(源)
可以节省构建新的哈希集的成本。你对此有什么看法吗?这非常有效,代码看起来非常紧凑:新的HashSet(new[]{5,6,7})。SetEquals(new[]{5,7,6})你得到了答案,因为你给了我比较计数的想法,所以它很好而且紧凑,谢谢!看起来是这样的:var source=new[]{5,6,7};source.Intersect(new[]{5,7,6}).Count()==source.Length@CubanX:请注意,如果源代码中包含任何重复项,则即使source.SetEquals(source)
也将返回false。@Jon很好,我可能必须在其中插入一个distinct以确保不会发生这种情况。答案示例中有一个错误。您需要将其与这两个计数进行比较,否则当源是目标的子集时,您的函数将返回“true”。即源{5,6}和目标{5,7,6}