无法找到两个数组的交集

时间:2013-03-26 22:25:22

标签: c#

我有一个数组int[] com,它包含两个值0和1(在初始阶段)。

我将另一个数组定义为String[] arr = new String[100];

arr包含6个元素:

arr[0]={4,8,10,11,12,14}
arr[1]={1,2,3,4,8,12,14}
.. arr[6]=something

我想找到arr [0]和arr [1]的交集,所以我把代码编写为:

foreach (int value1 in intersect) 
{
     //perform logic
}

这里我应该将value1作为4,8,但我得到的值是52,44。

我在做什么有什么问题?

2 个答案:

答案 0 :(得分:2)

好的,这就是你在做什么,你有字符串数组而不是int数组。如果你这样做

arr[0]="4,8,10,11,12,14";
arr[1]="1,2,3,4,8,12,14";
var intersection = arr[0].Intersect(arr[1]);

因为arr[0]arr[1]是字符串,所以你会得到这个字符'4', ',' , '8', '1', '2'列表的结果,它们分别对应于整数值52 44 56 49 50,这正是你到了。

你应该声明整数矩阵而不是字符串数组int [,] arr = new int[100,100];或更好List<List<int>>。你不能使用像字符串这样的整数,至少在这种情况下不能。

List<List<int>> arr = new List<List<int>>();
arr.Add(new List<int>{4,8,10,11,12,14});
arr.Add(new List<int>{1,2,3,4,8,12,14});
var intersection = arr[0].Intersect(arr[1]);

但如果您不相信我,并且想要确保您之前的代码没有意义,请更改foreach循环,看看发生了什么:

foreach (char value1 in intersect) 
{
     //perform logic
}

此外,您不需要这样做:

int zero= Convert.ToInt32(com[0].ToString());
int one= Convert.ToInt32(com[1].ToString());

您可以将其替换为:

int zero= com[0];
int one = com[1];

但是,由于你可以做到这一点,这是毫无意义的:

arr[com[0]]
arr[com[1]]

答案 1 :(得分:1)

LINQ Intersect方法正确计算数组之间的交集:

var a = new [] {4,8,10,11,12,14};
var b = new [] {1,2,3,4,8,12,14};
var intersection = a.Intersect(b);
// intersection:
// IEnumerable<int> { 4, 8, 12, 14 }

以上代码 - 代表最小的非失败的计数器示例 - 在LINQPad中运行。

请注意,Intersect依赖于Equals,因此可以“破坏”它:

var a = new object[] {4,8,10,11,12,14};
var b = new object[] {"1","2","3","4","8","12","14"};
var intersection = a.Intersect(b);
// intersection:
// IEnumerable<object> { }

当然,这个不会解释“随机新值” - 这只是其他地方的错误。