Ciao
L'idea di fondo da cui partire è quella dell'utilizzo di due cicli, poi si possono applicare delle ottimizzazioni per evitare lavori inutili o ripetuti.
Ad esempio potresti inizialmente ordinare i due array in ordine ascendente, quindi utilizzare i due cicli come nella funzione che ti ho scritto:
private static bool IsSubSet(int[] super, int[] array)
{
//Ordina gli array
Array.Sort(super);
Array.Sort(array);
//Questo è l'indice da cui iniziare a cercare l'elemento nell'array maggiore
int index = 0;
//Cicla sugli elementi dell'array più piccolo
for (int i = 0; i < array.Length; i++)
{
//Salta tutti gli elementi dell'array maggiore non contenuti nel minore
while (super[index] < array[i])
{
//Se non ci sono più elementi nell'array maggiore, ritorna false
if (++index == super.Length)
return false;
}
//Se il valore a cui siamo arrivati è maggiore di quello che cercavamo,
//l'elemento non è contenuto nell'array maggiore, quindi ritorna false
if (super[index] > array[i])
return false;
//Ora passa all'elemento successivo
}
//Abbiamo verificato che tutti gli elementi sono inclusi, possiamo ritornare true
return true;
}
In questo modo eviti di eseguire continui cicli sullo stesso array passando in rassegna gli stessi oggetti migliaia di volte, cosa che rende l'algoritmo molto veloce.
Per quanto riguarda il secondo problema invece, l'unico modo è proprio quello di usare degli if; se vuoi evitare di riscriverli ogni volta puoi scrivere una funzione che esegua il compito:
private static bool DateRangeOvelap(DateTime A, DateTime B, DateTime C, DateTime D)
{
if (B < A || D < C)
throw new ArgumentException("Intervalli non validi.");
if ((A < C && B < C) || (A > D && B > D))
return false;
return true;
}
Luca