Например, следующий составной запрос + метод выглядит недостаточно хорошо. Я ищу лучший подход.
foreach (var x in A)
{
foreach (var y in B)
{
if (getLazyList(x, y).Any(z => z == y))
{
blacklist.Add(x);
break;
}
}
}
Теперь по сравнению с этим, предоставленным: @Bob Vale
var q = from x in A
from y in B
where getLazyList(x,y).Contains(y)
select x;
blacklist.AddRange(q);
Будет ли второй метод делать ненужные циклы? в 1-м примере я использую .any () и break, чтобы выйти из внутреннего цикла, как linq справится с этим во 2-м случае?
3 ответа
Как насчет этого;
var q = from x in A
from y in B
where getLazyList(x,y).Contains(y)
select x;
blacklist.AddRange(q);
Если AddRange не работает, просто замените последнюю строку на
foreach (var x in q) blacklist.Add(x);
Чтобы справиться с перерывом, вам нужно будет использовать предложение any
var q = from x in A
where B.Any(y=>getLazyList(x,y).Contains(y))
select x
Вот немного другая реализация ваших циклов LINQ:
blacklist.AddRange(A.Where(x => B.Any(y => getLazyList(x, y).Any(z => z == y))));
Циклы for
в двух фрагментах будут выполняться одинаково, и единственная разница заключается в использовании Contains
vs Any
.
Этот вопрос LINQ Ring: Any () vs Contains () для огромных коллекций < / a> обсуждает разницу между двумя операторами.
Обычно Contains
не должен быть медленнее, чем Any
, но, вероятно, будет выполняться за то же время.
Разница в том, что Contains
будет оценивать, используя реализацию Equals
, тогда как Any
принимает делегат.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.