2009-11-09

LINQ - Except nie operuje na zbiorach

Przykład:
int[] ar1 = { 1, 2, 3, 3 };
int[] ar2 = { 1, 3 };
int[] ar3 = ar1.Except(ar2).ToArray();
int[] ar4 = ar1.Intersect(ar2).ToArray();
Tablica ar3 będzie zawierać jeden element 2. Przydałaby się metoda, która zachowywałaby się jak odjęcie zbioru od zbioru:
public static IEnumerable<T> Substract<T>(this IEnumerable<T> a_enumerable, IEnumerable<T> a_values)
{
    List<T> list = new List<T>(a_values);

    foreach (T ele in a_enumerable)
    {
        int index = list.IndexOf(ele);
        if (index != -1)
            list.RemoveAt(index);
        else
            yield return ele;
    }
}
Teraz:
int[] ar5 = ar1.Substract(ar2).ToArray();
zwróci nam zbiór { 2, 3}.