如何在C#中比较数组的相等性? 在C++中,如果你想检查2个数组是否相等(内容),你可以做: #include <vector> #include <cassert> using namespace std; int main (int argc, char * const argv[]) { vector<int> a; a.push_back(5); a.push_back(6); a.push_back(7); vector<int> b = a; // this copies array a's contents to array b assert( a == b ); // this compares the content of array a and b one element at a time return 0; } #包括 #包括 使用名称空间std; int main(int argc,char*const argv[]{ 载体a; a、 推回(5); a、 推回(6); a、 推回(7); 向量b=a;//将数组a的内容复制到数组b assert(a==b);//一次比较数组a和b的内容一个元素 返回0; }
如果不为循环编写自己的比较,我如何在C#中实现同样的功能 到目前为止,我找到了3个链接,但我不确定它们是否过时:如何在C#中比较数组的相等性? 在C++中,如果你想检查2个数组是否相等(内容),你可以做: #include <vector> #include <cassert> using namespace std; int main (int argc, char * const argv[]) { vector<int> a; a.push_back(5); a.push_back(6); a.push_back(7); vector<int> b = a; // this copies array a's contents to array b assert( a == b ); // this compares the content of array a and b one element at a time return 0; } #包括 #包括 使用名称空间std; int main(int argc,char*const argv[]{ 载体a; a、 推回(5); a、 推回(6); a、 推回(7); 向量b=a;//将数组a的内容复制到数组b assert(a==b);//一次比较数组a和b的内容一个元素 返回0; },c#,mono,C#,Mono,如果不为循环编写自己的比较,我如何在C#中实现同样的功能 到目前为止,我找到了3个链接,但我不确定它们是否过时: (滚动你自己的循环) (使用SequenceEqual()或Intersect()--但Mono支持这一点吗?) --我真的很惊讶比较数组内容不是现成的= 我是一名C#新手,我正在使用Mono。我不确定Mono,这就是我删除之前答案的原因 您可以通过循环/Stack实现来实现,因为push/Pop是O(1)操作,访问数组中的元素也是O(1)操作 If (Arr1.Length !
- (滚动你自己的循环)
- (使用SequenceEqual()或Intersect()--但Mono支持这一点吗?)
- --我真的很惊讶比较数组内容不是现成的=
我是一名C#新手,我正在使用Mono。我不确定Mono,这就是我删除之前答案的原因 您可以通过循环/Stack实现来实现,因为push/Pop是O(1)操作,访问数组中的元素也是O(1)操作
If (Arr1.Length != Arr2.Length)
{
return false // not equals
}
else
{
Arr1.Sort(); // important as both array has to be sorted
Arr2.Sort() ;// important as both array has to be sorted
for(int i=0;i<Arr1.Length ; i++)
{
if(Arr[i]!=Arr1[i])
break;
}
}
If(Arr1.Length!=Arr2.Length)
{
返回false//不等于
}
其他的
{
Arr1.Sort();//很重要,因为两个数组都必须排序
Arr2.Sort();//很重要,因为两个数组都必须排序
对于(inti=0;i,这里有一个有效的扩展方法可以实现这一点
public static bool Compare<T>(this T[] source, T[] target,
Func<T,T,bool> comparer )
{
if (source.Length != target.Length)
return false;
return !source.Where((t, i) => !comparer(t, target[i])).Any();
}
var a = new[] {2, 3, 4, 5, 6, 7, 8};
var b = new[] {2, 3, 4, 5, 6, 7, 8};
var c = new[] {2, 3, 4, 5, 6, 7, 8, 9};
var d = new[] {2, 4, 3, 5, 6, 8, 7};
var r1 = a.Compare(b, (i1, i2) => i1 == i2); // true
var r2 = a.Compare(c, (i1, i2) => i1 == i2); // false
var r3 = a.Compare(d, (i1, i2) => i1 == i2); // false
公共静态bool比较(此T[]源,T[]目标,
函数比较器)
{
if(source.Length!=target.Length)
返回false;
return!source.Where((t,i)=>!comparer(t,target[i]).Any();
}
var a=新[]{2,3,4,5,6,7,8};
var b=新[]{2,3,4,5,6,7,8};
var c=新[]{2,3,4,5,6,7,8,9};
var d=新[]{2,4,3,5,6,8,7};
var r1=a.比较(b,(i1,i2)=>i1==i2);//真
var r2=a.Compare(c,(i1,i2)=>i1==i2);//false
var r3=a.Compare(d,(i1,i2)=>i1==i2);//false
easy way您在Mono中尝试过LINQ/SequenceEqual/Intersect吗?如果成功,它将是最容易的赢家。@pst您应该发布一个答案并为他们赢得选票。:)@pst:我在MonoDevelop中尝试过,但Intellisense没有弹出任何内容,因此它一定不受支持。您要比较的确切集合类型是什么?它是IEnumerable吗?@Gishu:我正在尝试将Object[]与Object[]进行比较。实际上,内容只是:“A”、“B”、“C”。这是假设数组是无序的。@Brian:我在else中对数组进行了排序,这是第一步,我不知道Mono是否有排序方法。这是我的观点。在您的实现中{1,2}和{2,1}是相等的,但这可能不是预期的行为。仅此而已。如果支持LINQ,您可以简单地使用SequenceEqual
@Danny-如果两个源是数组且长度不等,那么我的实现将更快,因为SequenceEquals仅通过集合IEnumerable接口执行比较。此外,我的实现允许让用户提供一个执行比较的函数,而SequenceEquals尝试查找EqualityComparer.Default的值-如果缓存中不存在EqualityComparer.Default,则会使用反射创建一个,这可能会导致性能问题。我是指.Where()。代码中的任何
部分都可以是简单的
SequenceEqual,您还可以在其中提供自定义的比较器。
bool equals = array1.OrderBy(a => a).SequenceEqual(array2.OrderBy(a => a));