2017-01-03 3 views
0

私は人のリストに人の体重、年齢、都市、名前のプロパティを持っています。Linq抽出法や複数のデータでorder byとgroup byを使うにはどうすればいいですか?

Person.cs:

public class Person 
{ 
public int Weight { get; set; } 
public int Age { get; set; } 
public string Name {get; set;} 
public string City {get; set;} 
} 

のProgram.cs:一覧表示されます

List<Person> personList = new List<Person>(); 

personList.Add(new Person { Age = 15, Weight = 68, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 19, Weight = 75, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 17, Weight = 68, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 15, Weight = 55, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 15, Weight = 53, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 17, Weight = 88, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 19, Weight = 45, Name = “Dany”, City =”New York” }); 
personList.Add(new Person { Age = 20, Weight = 88, Name = “Dany”, City =”New York” }); 

//Grouped person list 
List<People> GroupedPersonList = new List<People>(); 

var GroupedPersonList = personList.GroupBy(x => x.Age , (key,element) => new 
{ 
    Age = key, 
    Weight = element.Max(c=>c.Weight) 
    City = ????, 
    Name = ????? 
}); 

要素:。年齢によってグループ化し、各グループは、最大の重みを選択する必要があります(私がしたいですこのリストは年齢順に並べ替えられますが、リストにはその年齢の最も重い人のみが含まれています)。新しい新しいリストは次のようになります:

(GroupedPersonLiコンテンツ)=>

年齢|重量|名前|市

------- | ------- | ------ | --------

15 | 68 |ダニー|ニューヨーク

17 | 88 |ダニー|ニューヨーク

19 | 75 |ダニー|ニューヨーク

20 | 88 |ダニー|ニューヨーク

foreach (var item in GroupedPersonList) 
    { 
    string city = item.City; // Error because No city in list 
    } 

私はこのようにグループ化できます。しかし、私は2つのプロパティ(年齢と体重)しか使用できません。これらのパラメータも割り当てる必要があります。他のパラメータを割り当てる方法は? LINQ抽出法ではどうしたらいいですか?あなたは、私は信じて欲しい

答えて

3

はこれです:これはあなたの元のリストを受け取り、ん

var GroupedPersonList = personList 
    .OrderByDescending(x => x.Weight) 
    .GroupBy(x=>x.Age) 
    .Select(x =>x.First()) 
    .OrderBy (x => x.Age); 

何:

  • 注文を重量降順で。
  • 年齢でグループ化します。これらのグループは、依然として体重の降順で順序付けられます。
  • 各グループの最初の項目を選択します。これは、順序が最も高い重み項目であるためです。
  • 結果のリストを目的の出力である年齢順に並べ替えます。

これは、あなたがそのように私が何かを誤解している可能性がありList<People>ことへの参照を持っているもののGroupedPersonListList<Person>でなければならないことを前提としています。 Peopleが実際にオブジェクトである場合、それがどのように見えるか教えてください!

また、最終的なリストは元のリストと同じオブジェクトへの参照になります。したがって、これらを変更した場合、元のオブジェクトに反映されます。これはあなたが望むものかもしれません。ただし、Personオブジェクト上にあるすべてのプロパティにアクセスできるということは、コード内で個々のプロパティを個別に設定する必要はありません。

2
var GroupedPersonList = personList.GroupBy(x => x.Age, (key, element) => 
{ 
    var weightiest = element.First(p => p.Weight == element.Max(c => c.Weight)); 
    return new 
      { 
       Age = key, 
       Weight = weightiest.Weight, 
        City = weightiest.City, 
       Name = weightiest.Name 
      }; 
}); 
+0

linq関数は、IfやForEachのように、{}でワープすると1行以上のコードを処理できます。 最初に、同じ年齢と場所を持つすべての人の中から最大の体重を持つ人(最初の人はどのように顎の体重を持っていますか)を見出します。 私は年齢(キー)と重量のあるオブジェクトのプロパティを使用して新しいオブジェクトを作成して返します。 –

2
var GroupedPersonList = personList.GroupBy(
    x => x.Age, 
    (k, x) => x.OrderByDescending(p => p.Weight).First()); 
関連する問題