4

次のデータがあるとします。

List<Country> countries = new List<Country>();

countries.Add(new Country{ Name = "USA",     population=500000,  Year=2012 });
countries.Add(new Country{ Name = "USA",     population=300000,  Year=2002 });
countries.Add(new Country{ Name = "USA",     population=250000,  Year=1992 });
countries.Add(new Country{ Name = "USA",     population=20000,   Year=1982 });

countries.Add(new Country{ Name = "India",   population=1500000, Year=2012 });
countries.Add(new Country{ Name = "India",   population=1000000, Year=2002 });
countries.Add(new Country{ Name = "India",   population=50000,   Year=1982 });
countries.Add(new Country{ Name = "India",   population=80000,   Year=1992 });

countries.Add(new Country{ Name = "Germany", population=100000,  Year=2012 });
countries.Add(new Country{ Name = "Germany", population=400000,  Year=2002 });
countries.Add(new Country{ Name = "Germany", population=60000,   Year=1992 });
countries.Add(new Country{ Name = "Germany", population=4000,    Year=1982 });

countries.Add(new Country{ Name = "UK",      population=450000,  Year=2002 });
countries.Add(new Country{ Name = "UK",      population=50000,   Year=1992 });
countries.Add(new Country{ Name = "UK",      population=3000,    Year=1982 });  

特定の年の最大人口で国を並べ替えたいのですが、次の国に移動する前に、その国のすべての年を表示します。

例えば

  1. 2012 年 - 人口の順序は、インド、アメリカ、イギリス、ドイツです。したがって、データをすべてインドのデータ、すべてのアメリカのデータ、すべてのイギリスのデータ、そしてドイツの順に並べたいと思います。

  2. 2002 年 - 人口の順序は、インド、アメリカ、ドイツ、イギリスの順になります。英国は 2002 年のデータがないため最後です。

過去にLINQを使用したことがありますが、LINQを使用してこれを実現したいのですが、これを回避するのに苦労しています。どんな助けでも大歓迎です。

4

3 に答える 3

4

データを国別にグループ化し、特定の年の人口別に並べ替える必要があります。

var year = 2002;    

var orderedCountries = countries
                        .GroupBy(c => c.Name)
                            .OrderByDescending(c => c.Where(y => y.Year == year).Select(p => p.population).FirstOrDefault())
                                .SelectMany(c=>c)  
                                .ToList();

上記のコードは、特定の年のデータがなくても機能します

これは読むのが少し大変なので、orderby のロジックをデリゲートに分けることができます。

var orderedCountries = countries
                            .GroupBy(c => c.Name)
                                .OrderByDescending(c => GetPop(c, year))
                                    .SelectMany(c=>c)  
                                        .ToList();

Func<IGrouping<string, Country>, int, long> GetPop = 
                                    ((cntry, yr) => (from c in cntry
                                                     where c.Year == yr
                                                     select c.population).First());
于 2012-10-03T15:54:37.960 に答える
0

これは saj の回答とまったく同じですが、クエリ構文を使用します。

var y = 2002;

var ordered = 
    from c in countries
    group c by c.Name into g
    select new
    {
        Name = g.Key,
        Population = (
            from x in g
            where x.Year == y
            select x.population).FirstOrDefault()
    } into s
    orderby s.Population descending
    join f in countries
    on s.Name equals f.Name
    select f;
于 2012-10-03T20:36:24.733 に答える
-1

ここで同様の質問があります: 複数の "order by" in LINQ

あなたの場合、このようなものがうまくいきます。VS でテストしたところ、期待どおりに動作しました。

var countries order= countries.OrderBy(c => c.Year).ThenBy(n => n.population);
于 2012-10-03T16:02:23.273 に答える