цикл foreach с условием в c # - PullRequest
       29

цикл foreach с условием в c #

1 голос
/ 09 ноября 2011

У меня есть этот цикл foreach в c #, так как я новичок в c #, мне было интересно, если это можно записать короче (есть условная часть цикла

foreach (PagerPageFilterInformation filter in PageFilterInformation)
{
    if (filter.Ancestor == myParent)
    {
        DoSomething()...//Using filter
        break;
    }
}

Я попытался сделать:

PagerPageFilterInformation filter = PageFilterInformation.FirstOrDefault(filter => filter.Ancestor == myParent);
if(filter != null)
{
DoSomething()...}

Но это не сработало. Может ли это быть потому, что класс:

PagerPageFilterInformation

Наследуется от класса:

PageFilterInformation

?

Ответы [ 5 ]

5 голосов
/ 09 ноября 2011

Если DoSomething() метод не использует найденный фильтр:

if (PageFilterInformation.Any(filter => filter.Ancestor == myParent))
{
   DoSomethng();
}

РЕДАКТИРОВАТЬ: Обновление, поскольку в комментариях были указаны новые требования

Если вам нужно пройти, найденофильтр в методе DoSomething():

var filter = PageFilterInformation.FirstOrDefault(f => f.Ancestor == myParent);
if (filter != null)
{
   DoSomething(filter);
}
2 голосов
/ 09 ноября 2011
foreach (PagerPageFilterInformation filter in PageFilterInformation.Where(f => f.Acestor==myParent))
        {
                DoSomething()...
        }
2 голосов
/ 09 ноября 2011

Ну, это зависит от того, нужно ли вам использовать первый filter, когда вы DoSomething (что похоже на то, что вы делаете). Но да, вы можете сократить этот код с помощью LINQ.

Если вам нужно filter:

var filter = PageFilterInformation.FirstOrDefault(filter => filter.Ancestor == myParent);
if(filter != null)
{
    DoSomething()...
}

Если нет, вы можете использовать Любой метод.

if (PageFilterInformation.Any(filter => filter.Ancestor == myParent)
{
    DoSomething()...
}
1 голос
/ 09 ноября 2011

Поскольку вы используете переменную filter, я бы использовал эту конструкцию:

var filter = PageFilterInformation.FirstOrDefault(f => f.Ancestor == myParent);
if (filter != null)
{
    DoSomething(filter);
}

Код становится легче читать, поскольку мне не нужно читать цикл и выяснить, что оностанавливается на первом найденном элементе.

0 голосов
/ 09 ноября 2011

Если PageFilterInformation является IEnumerable, вы можете использовать расширение метода System.Linq Where;

Сокращение кода не означает повышения эффективности, вы должны понимать, что эти операторы на самом деле производят как IL.

...