1

私は.NETの古い蜂ですが、Linqは非常に新しいです。いくつかの基本的な読書の後、私は自分のスキルをチェックすることに決めました、そして私は完全に失敗しました!どこを間違えているのかわかりません。

金額%100 == 0の間、各人の上位2つの注文を選択したいと思います。

これが私のコードです。

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());
            }
        }

誰かが焦点を合わせて、正しいクエリを教えてもらえますか?

前もって感謝します

4

2 に答える 2

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)
                });

foreachループを使用して結果のIEnumerableを出力すると、その出力は次のようになります。

XYZ
-->200
-->100
ABC
-->900
-->800
于 2013-03-26T01:04:53.677 に答える
0

これはすでに回答済みですが、新しいオブジェクトを作成せずに既存のオブジェクトを変更するだけの場合crecords、コードは次のようになります。ただし、例に示されているような匿名の構造を使用することはできません。つまり、PeopleクラスとOrderクラスを作成する必要があります

 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());
            }
        }
    }
于 2013-03-26T01:25:20.157 に答える