Подтвердить что ты не робот

Получение нечетной/четной части последовательности с LINQ

Скажем, у меня есть список всех Projects, и я их группирую с помощью Category следующим образом:

var projectsByCat = from p in Projects
                    group p by p.Category into g
                    orderby g.Count() descending
                    select new { Category = g.Key, Projects = g };

Теперь я хочу отобразить это как список на веб-странице, где сначала создаю левый div div, во-вторых, правый div. Я заказываю по номеру Projects в каждом Category, чтобы показать Categories с наибольшим Projects сверху - таким образом, я хотел бы разделить projectsByCat на два - если я поместил все "нечетные номера", Categories слева и "четные" категории справа, я думаю, что я получу разумно разумный вид.

Итак, я думал, что могу сделать это, чтобы получить нечетные и четные члены projectsByCat:

var oddCategories = projectsByCat.Where((cat, index) => index % 2 != 0);

var evenCategories = projectsByCat.Where((cat, index) => index % 2 == 0);

И он компилируется - однако, когда я запускаю его, я получаю такое исключение, как это:

Неподдерживаемая перегрузка, используемая для оператора запроса "Где".

И я думал, что я в безопасности, поскольку он скомпилирован в первую очередь..;)

Есть ли элегантный способ сделать это? А также есть ли элегантное объяснение того, почему мое творческое использование Where() не будет работать?

Спасибо заранее!

4b9b3361

Ответ 1

Если вы используете LINQ to SQL или LINQ to Entities, вы должны сначала полностью реализовать результаты в памяти:

var oddCategories  = projectsByCat.ToList().Where((c,i) => i % 2 != 0);
var evenCategories = projectsByCat.ToList().Where((c,i) => i % 2 == 0);

Невозможно выполнить итерацию результатов в базе данных с помощью индексатора без использования курсора, который либо с каркасом ORM выполняет не.

Ответ 2

Обратите внимание, что вызов .ToList() дважды для одного и того же запроса будет дважды запрашивать базу данных.

Было бы гораздо лучше кэшировать результат в промежуточном списке, а затем применить фильтрацию предикатов:

var projectsByCat =
    (from p in Projects
    group p by p.Category into g
    orderby g.Count() descending
    select new { Category = g.Key, Projects = g }).ToList();

var oddCategories = projectsByCat.Where((cat, index) => index % 2 != 0);
var evenCategories = projectsByCat.Where((cat, index) => index % 2 == 0);

Ответ 3

Нечетные категории и четные категории отстают.

Индексы начинаются с 0 не 1

0% 2 = 0

0 индекс нечетный.

var oddCategories  = projectsByCat.Where((cat, index) => index % 2 == 0);

var evenCategories = projectsByCat.Where((cat, index) => index % 2 != 0);

Ответ 4

Правильный способ сделать это с помощью LINQ и избегать множественных перечислений над входом - это сделать группировку или аналогичную информацию о том, является ли каждый элемент четным или нечетным.

Простой способ использования перегрузки для Select, который смешивается в индексе в сочетании с ToLookup дает вам то, что вы хотите:

var oddsAndEvens = input
    .ToList() // if necessary to get from IQueryable to IEnumerable
    .Select((item, index) => new { isEven = index % 2 != 0, item })
    .ToLookup(
        i => i.isEven,
        i => i.item);

Это создаст структуру данных Lookup<TKey, TElement>, которая имеет следующую выгоды:

Если ключ не найден в коллекции, возвращается пустая последовательность.

Это означает, что после указанного выше запроса LINQ вы можете:

var evens = oddsAndEvens[true];
var odds = oddsAndEvens[false];

Ответ 5

Вы можете отделить нечетные и даже ваши взгляды с помощью linq.

//even 
@foreach (var item in Model.Where((item, index) => index % 2 == 0))
{
     //do the code
}

//odd
@foreach (var item in Model.Where((item, index) => index % 2 != 0))
{
     //do the code
}

Ответ 6

var text = "this is a test <string> to extract odd <index> values after split";
var parts = text.Split(new char[] { '<', '>' });
IEnumerable words = parts.Where(x => parts.ToList().IndexOf(x) % 2 == 1)

слова будут содержать "строку" и "индекс"

Ответ 7

Вы можете найти четное нечетное число без цикла foreach

static void Main(string[] args)
{
    List<int> lstnum = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    List<int> lstresult = lstnum.FindAll(x => (x % 2) == 0);

    lstresult.ForEach(x => Console.WriteLine(x));
}