C #: замена циклов с помощью LINQ - PullRequest
0 голосов
/ 20 июля 2011

Что было бы эквивалентно для этих примеров кода в LINQ (C #):

    int[] items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int number = -1;
foreach (int i in items) 
{
    if (i == 5) 
    {
        number = i;
        break;
    }
}

И как бы вы заменили цикл for с двумя (или более) условиями в LINQ? (похоже на приведенный выше код, не может придумать лучшего примера. Представьте, что в цикле for происходят другие условия или проверки)

    int[] items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int number = -1;

for (int i = 0; i < items.Length && number == -1; i++) 
{
    if (items[i] == 5)
        number = items[i];
}

И третийкусок кода, как бы это перевести в LINQ:

    List<int> items2 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int i = items2.Count - 1;

for (; i > 0; i--)
    items2.RemoveAt(i);

Заранее спасибо.

Ответы [ 2 ]

9 голосов
/ 20 июля 2011

Первые два довольно странные, но в основном они эффективны:

int number = items.Contains(5) ? 5 : -1;

или

int number = items.Any(x => x == 5) ? 5 : -1;

Альтернативный способ сделать это:

int number = items.Where(x => x == 5).DefaultIfEmpty(-1).First();

Если вы можете придумать более реалистичные операции, мы можем предложить более разумные запросы LINQ:)

Третий фрагмент не может быть действительно переведен в LINQ, поскольку это не запрос - это мутирует список.

2 голосов
/ 20 июля 2011

Как указывает Джон, последний не может быть переведен в LINQ.Тем не менее, это может быть упрощено как:

var survivers = 1;
items2.RemoveRange(survivers , items2.Count - survivers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...