有没有办法检测多维数组中的类似元素?例如:
int[][] arrayA = {{1 , 2}, {4 , 6}, {3, 7}};
int[][] arrayB = {{3 , 2}, {1 , 2}, {8, 5}};
arrayA
和arrayB
都有元素{1 , 2}
。 (或者简单地说,任何共同的元素)有没有办法检测它是true
?
答案 0 :(得分:1)
是的,您只需要对逻辑进行编码即可进行检测。
bool result = false;
foreach (var arrayAItem in arrayA)
{
foreach (var arrayBItem in arrayB)
{
if (arrayAItem.SequenceEqual(arrayBItem))
{
result = true;
break;
}
}
if (result == true)
{
break;
}
}
和一个班轮
bool result = arrayA.Any(arrayAItem => arrayB.Any(arrayBItem => arrayAItem.SequenceEqual(arrayBItem)));
答案 1 :(得分:0)
这是什么东西?
arrayA.Where(arr => arrayB.Any(arr2 => arr1.OrderBy(x => x)
.SequenceEquals(arr.OrderBy(x => x)))).ToArray()
如果需要,您可以删除两个OrderBy
来电,具体取决于您希望如何将两个数组视为“相同”。
答案 2 :(得分:0)
如果不给你代码,很难给你答案,但是:
对于数组A中的每个元素,检查它是否等于数组B中的每个元素。所以基本上,你需要一个嵌套的foreach
。如果要记录它们共有的元素,请将它们添加到List<ElementType>
(不是数组,因为您要动态填充它)。
由于你的数组是嵌套的,所以它并不那么简单。你不能只检查arrayA[x] == arrayB[x]
,因为你要比较数组,它们是引用类型(它会返回false,除非它们都指向同一块内存)。相反,您必须在已经拥有的两个foreach
内添加一个循环来检查int
中的每个arrayA
与arrayB
中相关的int
。 ==
是一种值类型,因此TextView
比较会表现出您的预期。
答案 3 :(得分:0)
以下是如何做到这一点(而不仅仅是):
var commonItems = from innerA in arrayA
from innerB in arrayB
where innerA.SequenceEqual(innerB)
select innerA;
bool anyCommon = commonItems.Any();
var firstCommon = commonItems.FirstOrDefault();
var commonCount = commonItems.Count();
我猜变量名称是不言自明的: - )
答案 4 :(得分:0)
以下代码变长,但会为您提供所需的输出:
private void TestArrays()
{
int[,] arrayA = new[,] { { 1, 2 }, { 4, 6 }, { 3, 7 } };
int[,] arrayB = new[,] { { 3, 2 }, { 1, 2 }, { 8, 5 } };
int parentLengthA = arrayA.GetLength(0);
int childLengthA = arrayA.GetLength(1);
int parentLengthB = arrayB.GetLength(0);
int childLengthB = arrayB.GetLength(1);
int[] itemsOfA;
int[] itemsOfB;
List<int[]> matchedArrays = new List<int[]>();
for (int i = 0; i < parentLengthA; i++)
{
itemsOfA = new int[childLengthA];
for (int j = 0; j < parentLengthB; j++)
{
itemsOfB = new int[childLengthB];
bool isMatched = true;
if (itemsOfA.Length != itemsOfB.Length)
{
isMatched = false;
break;
}
for (int k = 0; k < itemsOfA.Length; k++)
{
if (arrayA[i, k] != arrayB[j, k])
{
isMatched = false;
break;
}
else
{
itemsOfA[k] = arrayA[i, k];
}
}
if (isMatched)
{
matchedArrays.Add(itemsOfA);
}
}
}
//Just to output the matched array(s)
if (matchedArrays.Count > 0)
{
StringBuilder sb = new StringBuilder();
foreach (int[] matchedArray in matchedArrays)
{
foreach (int i in matchedArray)
{
sb.Append(i + ",");
}
sb.AppendLine();
}
MessageBox.Show(sb.ToString());
}
}