Это значительно более эффективное решение, чем другие, размещенные здесь, особенно топовое решение:
bool isSubset = t2.All(elem => t1.Contains(elem));
Если вы можете найти один элемент в t2, которого нет в t1, то вы знаете, что t2 не является подмножеством t1. Преимущество этого метода в том, что он выполняется на месте, без выделения дополнительного пространства, в отличие от решений, использующих .Except или .Intersect. Кроме того, это решение может сломаться, как только оно найдет один элемент, который нарушает условие подмножества, в то время как другие продолжают поиск. Ниже приведена оптимальная длинная форма решения, которая в моих тестах лишь незначительно быстрее, чем приведенное выше сокращенное решение.
bool isSubset = true;
foreach (var element in t2) {
if (!t1.Contains(element)) {
isSubset = false;
break;
}
}
Я сделал некоторый элементарный анализ производительности всех решений, и результаты были радикальными. Эти два решения примерно в 100 раз быстрее, чем решения .Except () и .Intersect (), и не используют дополнительную память.