Ответ 1
Использование LINQ:
array1.Intersect(array2).Any()
Примечание. Использование Any()
гарантирует, что алгоритм пересечения останавливается при обнаружении первого равного объекта.
Учитывая 2 массива int, например foo
и bar
, наиболее эффективный способ проверить, что панель массива содержит хотя бы один элемент, который содержит foo. должен возвращать true/false.
Я подозреваю, что вложенный foreach
но просто интересно, есть ли более хороший способ?
Использование LINQ:
array1.Intersect(array2).Any()
Примечание. Использование Any()
гарантирует, что алгоритм пересечения останавливается при обнаружении первого равного объекта.
С# 3:
bool result = bar.Any(el => foo.Contains(el));
Параллельное выполнение С# 4:
bool result = bar.AsParallel().Any(el => foo.AsParallel().Contains(el));
Да вложенные петли, хотя один скрыт:
bool AnyAny(int[] A, int[]B)
{
foreach(int i in A)
if (B.Any(b=> b == i))
return true;
return false;
}
Для метода одноразового случайного массива ваш метод кажется самым быстрым. Существуют методы, которые сделали бы его более эффективным, если бы одна или обе матрицы были отсортированы, их верхняя/нижняя граница известна или один из них изменяется реже, чем другой, и вы выполняете много проверок. Дело в том, что вы можете готовить различные хэши, индексы и подсказки, которые оптимизируют поиск почти до нуля, но процесс индексации сам по себе, как правило, занимает более одного поиска.
Другое решение:
var result = array1.Any(l2 => array2.Contains(l2)) == true ? "its there": "not there";
Если у вас есть класс вместо встроенных типов данных, таких как int и т.д., Тогда вам необходимо переопределить реализацию Override Equals
и GetHashCode
для вашего класса.