2013-03-26 2 views
1

Я старая пчела в .NET, но очень новая для Linq! После некоторого базового чтения я решил проверить свое мастерство, и я потерпел неудачу полностью! Я не знаю, где я ошибаюсь.Выберите первые N записей после фильтрации в каждой группе

Я хочу, чтобы выбрать самый высокий 2-го порядка для каждого человека, в то время как для Сумма% 100 == 0.

Вот мой код.

var crecords = new[] { 
       new { 
        Name = "XYZ", 
        Orders = new[] 
        { 
         new { OrderId = 1, Amount = 340 }, 
         new { OrderId = 2, Amount = 100 }, 
         new { OrderId = 3, Amount = 200 } 
        } 
       }, 
       new { 
        Name = "ABC", 
        Orders = new[] 
        { 
         new { OrderId = 11, Amount = 900 }, 
         new { OrderId = 12, Amount = 800 }, 
         new { OrderId = 13, Amount = 700 } 
        } 
       } 
      }; 


     var result = crecords 
          .OrderBy(record => record.Name) 
          .ForEach 
           (
            person => person.Orders 
            .Where(order => order.Amount % 100 == 0) 
            .OrderByDescending(t => t.Amount) 
            .Take(2) 
           ); 


     foreach (var record in result) 
     { 
      Console.WriteLine(record.Name); 
      foreach (var order in record.Orders) 
      { 
       Console.WriteLine("-->" + order.Amount.ToString()); 
      } 
     } 

Может ли кто-нибудь сосредоточиться и рассказать мне, что будет правильным вопросом?

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

ответ

3

Попробуйте этот запрос:

var result = crecords.Select(person => 
      new 
       { 
        Name = person.Name, 
        Orders = person.Orders.Where(order => order.Amount%100 == 0) 
              .OrderByDescending(x => x.Amount) 
              .Take(2) 
       }); 

Использование цикла Еогеасп для печати результирующий IEnumerable, выход из него является:

XYZ 
-->200 
-->100 
ABC 
-->900 
-->800 
+0

А, это правильно. Большое спасибо. –

+0

Без проблем - рад, что я мог бы помочь :) –

+1

Ударьте меня тоже, причина этой ошибки связана с тем, что ForEach() возвращает void, потому что он фактически модифицирует себя, поэтому ему ничего не нужно возвращать. Таким образом, ваш «результат» будет равен – Corylulu

0

Это уже ответили но если вы не хотите создавать новые объекты и просто модифицируете существующий crecords, код будет похож на этот вариант. Но вы не сможете использовать анонимные структуры, как показано в вашем примере. Это означает, что вам придется создавать классы людей и заказов

private class People 
{ 
     public string Name; 
     public IEnumerable<Order> Orders; 
} 

private class Order 
{ 
     public int OrderId; 
     public int Amount; 
} 

public void PrintPeople() 
{ 
     IEnumerable<People> crecords = new[] { 
      new People{ 
       Name = "XYZ", 
       Orders = new Order[] 
       { 
        new Order{ OrderId = 1, Amount = 340 }, 
        new Order{ OrderId = 2, Amount = 100 }, 
        new Order{ OrderId = 3, Amount = 200 } 
       } 
      }, 
      new People{ 
       Name = "ABC", 
       Orders = new Order[] 
       { 
        new Order{ OrderId = 11, Amount = 900 }, 
        new Order{ OrderId = 12, Amount = 800 }, 
        new Order{ OrderId = 13, Amount = 700 } 
       } 
      } 
     }; 
     crecords = crecords.OrderBy(record => record.Name); 
     crecords.ToList().ForEach(
       person => 
       { 
        person.Orders = person.Orders 
          .Where(order => order.Amount%100 == 0) 
          .OrderByDescending(t => t.Amount) 
          .Take(2); 
       } 
      ); 


     foreach (People record in crecords) 
     { 
      Console.WriteLine(record.Name); 
      foreach (var order in record.Orders) 
      { 
       Console.WriteLine("-->" + order.Amount.ToString()); 
      } 
     } 
    } 
Смежные вопросы