Получаю в качестве параметра массив элементов.
Иногда надо вывести только элементы, которые в массиве, а иногда наоборот надо их "выбросить".
Ввел параметр Exclude — bool
Как это сделать без написания if а с помощью contains?
Здравствуйте, Аноним, Вы писали:
А>Есть на linq функция Contains. А>Получаю в качестве параметра массив элементов. А>Иногда надо вывести только элементы, которые в массиве, а иногда наоборот надо их "выбросить". А>Ввел параметр Exclude — bool А>Как это сделать без написания if а с помощью contains?
// Определяем, есть ли один из элементов массива в nodesvar result = nodes.Intersect(new int[] {1, 2, 3}).Any();
Теперь у нас есть булев параметр exclude, который должен работать так:
exclude→
result
↓
true
false
true
false
true
false
true
false
var exclude = false; // То есть, с учётом exclude:var result = nodes.Intersect(new int[] {1, 2, 3}).Any() ^ exclude;
Help will always be given at Hogwarts to those who ask for it.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Инвертирование contains
От:
Аноним
Дата:
06.10.10 11:11
Оценка:
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Lloyd, Вы писали:
L>>А где тут "вывести элементы"?
_FR>Да, я почему-то на другой, не заданный, вопрос ответил
в общем, получается, не подоходит вариант с Intersect
Здравствуйте, Аноним, Вы писали:
L>>>А где тут "вывести элементы"? _FR>>Да, я почему-то на другой, не заданный, вопрос ответил
А>в общем, получается, не подоходит вариант с Intersect
Главное в моём ответе (и, на самом деле в стартовом вопросе) — это не Intersect, а ксор. Вот вам элементы, а там уж или печатайте их или что ещё:
private static IEnumerable<T> Get<T>(this IEnumerable<T> source, IEnumerable<T> check, bool exclude, IEqualityComparer<T> comparer = null) {
var set = new HashSet<T>(check, comparer);
return source.Where(item => set.Contains(item) ^ exclude);
}
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Инвертирование contains
От:
Аноним
Дата:
07.10.10 09:42
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
А>>Как это сделать без написания if а с помощью contains?
L>
L>>Для toExclude лучше использовать HashSet, чтобы избежать упомянутой квадратичной зависимоси.
А>а где почитать про внутренности linq или как лучше писать на linq чтобы добиться оптимальной производительности?
Не знаю, что посоветовать. Тут главное понимать, во что разворачивается linq-овские вызовы и уже из этого строить предположения по поводу производительности.
Например, твой код развернется во что-то типа (на самом деле будут еще и вызовы с лямбдой, но это несущественно):
foreach(var n in nodes) {
bool contains = false;
foreach(var ex in new []{1, 2, 3}) {
if (ex == n) {
contains = true;
break;
}
}
if (contains)
yield return n;
}
Тут явно заметны 2 косяка:
1. пересоздание массива на каждой итерации
2. линейный поиск по массиву.
Обе этих проблемы решаются заменой массива на HashSet и выносом за тело метода.