我有一个数组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。
我在做什么有什么问题?
答案 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> { }
当然,这个不会解释“随机新值” - 这只是其他地方的错误。