我需要找到2个未排序的字节数组之间的差异。这些数组的大小相当不错,大约有300万个元素。
数组中的值将重复,因此我无法对其进行排序。
这些数组的长度相同。我只需要差异的索引。
我是否必须使用for循环遍历每个数组元素?
有更好的方法吗?
我目前使用for循环遍历每个元素,但我觉得必须有更好的方法。
感谢您的帮助。
答案 0 :(得分:4)
如果最快的方式是你的最终目标,那么for循环听起来就像是实现这一目标最直接的方式:
public static List<int> GetDifferentIndexes(byte[] arr1, byte[] arr2)
{
// List to hold indexes of differences
List<int> lstDiffs = new List<int>();
// Assure neither array is null and lengths match
if (arr1?.Length == arr2?.Length)
{
// Loop through both arrays and check each value
for (int idx = 0; idx < arr1.Length; idx++)
{
if (arr1[idx] != arr2[idx])
{
// Add index to list since values do not match
lstDiffs.Add(idx);
}
}
}
// Your list of different indexes
return (lstDiffs);
}
答案 1 :(得分:3)
我想用LINQ来做这件事。我用了三遍来实现结果
以下是您可以尝试的代码:
public static int[] GetIndexOfDifferences<T>(T[] array1, T[] array2) where T : IEquatable<T>
{
var diff_check = array1.Zip(array2, (x, y) => x.Equals(y));
var get_index = Enumerable.Range(0, array1.Length).Zip(diff_check, (i, z) => z ? -1 : i);
return get_index.Where((i) => i>=0).ToArray();
}
static void Main(string[] args)
{
var a = new[] { 1, 1, 1, 2, 2, 3, 5, 5, 6, 3, 3, 2, 2 };
var b = new[] { 1, 1, 2, 2, 3, 3, 3, 4, 6, 5, 4, 3, 2 };
// equals? Y Y N Y N Y N N Y N N N Y
// index: 0 1 2 3 4 5 6 7 8 9 10 11 12
// expected result = { 2, 4, 6, 7, 9, 10, 11 }
var result = GetIndexOfDifferences(a, b); // check
}
答案 2 :(得分:0)
这可以简单地使用交叉/排除来完成,这种情况更适合您。看一下这个例子(两个数组都有数字5和7,其他元素不同)。
int[] arrayA = { 2, 5, 7, 8, 10 };
int[] arrayB = { 1, 3, 5, 7, 9 };
//this will contain all elements that are in both arrays
var sameElements = arrayA.Intersect(arrayB);
//elements that are in array A, but not in array B
var exceptElements = arrayA.Except(arrayB);
//elements from array A and array B but not in both
var nonintersect = arrayA.Except(arrayB).Union(arrayB.Except(arrayA));
编辑:由于OP要求索引(并且我没有仔细阅读),这可以通过(几乎)单行程轻松实现:
//data - arrays are same on all elements except third and last one (indexes 2 and 4).
int[] arrayA = { 1, 3, 6, 7, 8 };
int[] arrayB = { 1, 3, 5, 7, 9 };
List<int> listA = arrayA.ToList();
var differentIndexes = listA.Where(a => a != arrayB[listA.IndexOf(a)]).Select(a => listA.IndexOf(a));