将一个数组的序列代入另一个数组

本文关键字:数组 代入 另一个 一个 | 更新日期: 2023-09-27 17:50:10

我有两个数组对象

int[] arr1= new int[] {1,2,5,6,7,9,3,5,6,7}
int[] arr2 = new int[] {5,6,7}

现在,如何在arr1中找到arr2的出现次数?

将一个数组的序列代入另一个数组

也许不是很优雅,但它应该可以工作。这选择a中具有与b相同长度的所有子阵列,并检查有多少子阵列等于b

int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 3};
int count = 0;
int bl = b.Length;
for (int i = 0; i <= a.Length - bl; i++)
{
    var suba = a.Skip(i).Take(bl);
    if (suba.SequenceEqual(b))
    count++;
}

注意:此解决方案考虑了重叠的子阵列,因此如果a = {2, 2, 2}b = {2, 2},则计数为2

您可以使用arr2.Intersect(arr1).Count()

因此,在您的情况下,它将返回3,因为arr2中的3个元素存在于arr1中。

如果这不是你想要的,请澄清。

使用intersect。这个代码片段将解决您的问题并打印所有重复项,并显示arr1中每个重复项的计数。请注意,我还使用了LinqDistinct((,因此在循环常见事件时,我只检查一次,而不是多次。

int[]arr1=新int[]{1,2,5,6,7,9,3,5,6,7};int[]arr2=新int[]{5,6,7};var listCommon=arr1.AsEnumerable((。其中(arr2.AsEnumerale((.Contains(;foreach(listCommon.Distinct((中的var x({var numberOfOccurrencesInAr1=arr1.Where(y=>y==x(.Count((;Console.WriteLine(x+"为:"+numberOfOccurrencesInArr1.ToString((+"arr1中的次数"(;}Console.ReadLine((;

有关详细信息,请参阅MSDN;http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect(v=vs.110(.aspx

listCommon将是两个数组中的公共项数。

试试这个

    string result = string.Empty; ;
    int[] arr1 = new int[] { 1, 2, 5, 6, 7, 9, 3, 5, 6, 7 };
    int[] arr2 = new int[] { 5, 6, 7 };

    int count = arr2.Intersect(arr1).Count();
    if (count == arr2.Length)
    {
        result = "Found";
    }
    else
    {
        result = "Not Found";
    }

如果你想计算第二个数组的整数在第一个数组中出现的次数,那么你可以写

int[] arr1 = new int[] {1,2,5,6,7,9,3,5,6,7};
int[] arr2 = new int[] {5,6,7};
Dictionary<int, int> counter = new Dictionary<int, int>();
foreach(int x in arr1)
{
    if(arr2.Contains(x))
    {
        if(counter.ContainsKey(x))
          counter[x]++;
        else
          counter[x] = 1;
     }     
}
foreach(KeyValuePair<int, int> kvp in counter)
   Console.WriteLine("Key=" + kvp.Key.ToString() + " is present " + kvp.Value.ToString() + " times");
int[] arr1 = new int[] { 1, 2, 5, 6, 7, 9, 3, 5, 6, 7 };
int[] arr2 = new int[] { 5, 6, 7 };

如何在arr1中找到arr2的出现次数
如果您期望的结果是2。由于5、6、7在arr1 中出现两次

试试这个

 var res = arr1.Where(x => arr2.Contains(x)).Count()/arr2.Count();

试试这个:

var results = (from a1 in arr1
              join a2 in arr2
              on a1 equals a2
              group arr1 by a1 into Group
              select new
              {
                  Number = Group.Key,
                  Times = Group.Count()
              });
foreach(var result in results)
    Console.WriteLine(result.Number+" "+result.Times);

请使用以下fiddle.NET fiddle 检查此解决方案

您可以在第一个计数中的int s上使用ToLookup,该计数也在第二个数组中。然后你只需要取所有组的最小计数,因为这是最大的交集:

var subsetGroups = arr1.Where(i1 => arr2.Contains(i1)).ToLookup(i => i);       
int minGroupCount = 0;
// check if all integers from the array are in the first at all
if(arr2.All(i => subsetGroups.Contains(i)))
{
    minGroupCount = subsetGroups.Min(g => g.Count()); // 2
}

请注意,这种方法不关心顺序,也不关心第二个数组中重复的数量。这可能是想要的,也可能不是。

当您输入is数组时,您可以使用索引来有效地计算子数组在主数组中的出现次数:

var count = 0;
for (var i = 0; i < arr1.Length - arr2.Length + 1; i += 1) {
  if (arr1[i] != arr2[0])
    continue;
  var isSubarray = true;
  for (var j = 0; j < arr2.Length; ++j)
    if (arr1[i + j] != arr2[j]) {
      isSubarray = false;
      break;
    }
  if (isSubarray)
    count += 1;
}

结果将是2,因为567在1256793567中被找到两次。

如果子阵列本身可以"重叠"(例如111中的11(,则所有"重叠"都将被计数(例如,本例的结果为2(。如果不是这样的话,您只需在主循环结束时提前索引i,就可以跳过找到的子数组。