-3

我有一个数组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,但我将 value1 设为 52,44。

我在做什么有什么问题?

4

2 回答 2

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]]
于 2013-03-26T22:57:50.533 回答
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> { }

当然,这考虑“随机新值” - 这只是其他地方的错误。

于 2013-03-26T22:33:01.473 回答