Фильтрация списка на основе другого списка - LINQ - PullRequest
1 голос
/ 01 октября 2011

У меня есть два IEnumerable списка.

Я хочу заполнить значения во втором списке на основе результатов первого.

Первый список IEnumerable заполняется так:

IEnumerable<SelectListItem> selectedList =
CategoryServices.GetAttributesByCategoryID(categoryID); // it returns selected attributes for a particular category

У меня есть функция для получения всех атрибутов. Теперь я хочу получить другой список, который содержит все другие атрибуты (т.е. элементы, которых нет в selectedList) Я попробовал это:

IEnumerable<SelectListItem> available =
CategoryServices.GetAllAttributes().Where(a => !selectedList.Contains(a));

Но это не фильтрация. Я получаю все атрибуты ... Есть идеи?

Ответы [ 3 ]

2 голосов
/ 01 октября 2011

Убедитесь, что ваш класс SelectListItem реализует IEquatable<SelectListItem>, чтобы метод Contains() имел надлежащие средства для определения равенства экземпляров.

2 голосов
/ 01 октября 2011

Я думаю, это поможет вам

int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };

IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB);

Console.WriteLine("Numbers in first array but not second array:");
foreach (var n in aOnlyNumbers)
{
    Console.WriteLine(n);
}

Результат

Числа в первом массиве, но не во втором массиве: 0 2 4 6 9

0 голосов
/ 01 октября 2011

GetAllAttributes(), вероятно, принесет вам новый раунд объектов, они не будут такими же, как те, что возвращены GetAttributesByCategoryID(...) Вам нужно сравнить что-то лучше, чем ссылки на объекты.

Вы можете реализовать System.IEquatable<T>, чтобы изменить компаратор по умолчанию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...