2015-03-25 2 views
3

У меня есть два массива, один сингулярный и другой 2-мерный.Проверка наличия двух последних чисел в массиве существует в 2D-массиве с использованием петель

int[][] array1 = { 
    new int [] {1, 22, 3, 44, 5, 66}, 
    new int [] {11, 22, 33, 44, 55, 66}, 
    new int [] {1, 2, 3, 4, 5, 6}, 
}; 

int[] array2 = new int[] {1, 2, 3, 5, 66} 

Мне нужно создать цикл, который ищет в array1 как для 2-го последних цифр в массив2, поэтому было бы вернуться, сколько раз массив с array1 содержит как 5 и 66, что является 1, а другой два содержат только 1 из каждого числа.

Мне уже удалось написать функцию, которая возвращает, сколько раз массив2 в целом существует в массиве 1, эта новая функция фактически является уточнением этого.

for (int a = 0; a < array1[i].Length; a++) 
{     
    for (int b = 0; b < array2.Length; b++) 
    { 
     if (array2[c] == array1[a][b])        
      count++; 

     temp[b] = array1[a][b]; 
    } 
} 

Я чувствую, все было бы необходимо искать только две последние цифры небольшое изменение в этой функции, я попытался добавить в другую петлю, но это не сработало. Как мне это сделать? Я использую циклы, а не Содержит по какой-то причине, так как я все еще изучаю основы.

+0

Имеет ли значение, какое положение две цифры встречаются в 2D-массиве (например, только в конце) или может происходить в любом положении? –

+0

@MatthewWatson совсем нет, например массив (5, 74, 73, 92, 48, 66) все еще будет считать ++, я просто пытаюсь найти массивы, где оба числа существуют в определенном порядке. Похоже на номера суппа в лотерее. –

+0

@RobertPaulson Тогда вы можете попробовать мой ответ. –

ответ

3

Единственное, что неясно, что имеет значение, в каком положении две цифры встречаются в 2D-массиве? Если ithis это не так, то вы можете использовать Intersect(), который производит множество пересечения двух последовательностей, используя компаратор равенства по умолчанию для сравнения значений:

var result = array1.Count(x => x.Intersect(array2.Reverse().Take(2)).Count() == 2); 

Если вы заплатили внимание мы использовали эти линия, для получения двух последних элементов из array1:

array1.Reverse().Take(2); 

.NET Fiddle

Дополнительно:

Если вы хотите найти, если последние два элемента массива в 2D массива равен последнему два элемента array1, то вы можете попробовать LINQ решение:

var result = array1.Count(x=> x.Reverse().Take(2).SequenceEqual(array2.Reverse().Take(2))); 

Пояснения к используемым методам расширения:
Reverse() инвертирует порядок элементов в последовательности.
Take() возвращает указанное количество смежных элементов с начала последовательности.
определяет, равны ли две последовательности, сравнивая элементы с помощью сравнения по умолчанию для их типа.

После получения двух последних элементов обоих массивов мы будем использовать SequenceEqual(), чтобы определить, равны ли оба массива.

+0

, не имея возможности реализовать это в цикле –

+0

@RobertPaulson Вы не должны включать это в цикл. Этой линии достаточно. Не забудьте включить 'using Sytem.Linq' –

+0

@RobertPaulson Проверьте мое обновление в моем ответе, в котором содержится ссылка на Fiddle. –

1
var res = array1.Where((x) => (x.Contains(array2.Last()) && x.Contains(array2[array2.Length - 2]))).Count(); 

Explaination:

  • array1.Где берет каждый подмассив массива 1 и фильтрует те, которые соответствуют определенному условию.
  • Условие, являющееся каждым подмассивом array1, содержит последний элемент && next-to-last array2.
  • Методы Count() возвращает количество подмассивов, которые отвечают условия
+0

Вообще-то избегайте ответов только на код. Подумайте о добавлении описания, которое поможет объяснить ваш код. благодаря – MickyD

0

Вы можете создать массив целевых значений, а затем подсчитывают число раз, что пересечение этого массива с каждым подмассива в 2D массив содержит все элементы в целевом массиве:

using System; 
using System.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     [STAThread] 
     private static void Main() 
     { 
      int[][] array1 = 
      { 
       new [] {1, 22, 3, 44, 5, 66}, 
       new [] {11, 22, 33, 44, 55, 66}, 
       new [] {1, 2, 3, 4, 5, 6}, 
       new [] {1, 66, 3, 4, 5, 6} // This one has the target items out of order. 
      }; 

      int[] array2 = {1, 2, 3, 5, 66}; 

      // Extract the targets like this; it avoids making a copy 
      // of array2 which occurs if you use IEnumerable.Reverse(). 

      int[] targets = {array2[array2.Length - 2], array2[array2.Length - 1]}; 

      // Count the number of times that each subarray in array1 includes 
      // all the items in targets: 

      int count = array1.Count(array => array.Intersect(targets).Count() == targets.Length); 

      Console.WriteLine(count); 
     } 
    } 
} 
Смежные вопросы