3

我有这些数据,我正在使用 linqToExcel: 在此处输入图像描述

我试图将通货膨胀除以 GDP ......然后让它们升值,但我做错了。

    var people = from x in excel.Worksheet<CountryEconomics>("Sheet1")
                 let c = x.Inflation / x.GDP
                 orderby c ascending 
                 select c;

我得到输出:

12
6
4
3
2
2

无论我在查询中放置升序还是降序。我怎样才能让数据升序?IE

2
2
3
4
6
12
4

3 回答 3

3

MSDN orderby 子句

var people = from x in excel.Worksheet<CountryEconomics>("Sheet1")
             let c = x.Inflation / x.GDP
             orderby c
             select c;  

我不能只用一个数组来重现:

var economics = new[]
    {
        new {Country = "USA", GDP = 1, Inflation = 12},
        new {Country = "GB", GDP = 2, Inflation = 12},
        new {Country = "JPN", GDP = 3, Inflation = 12},
        new {Country = "GER", GDP = 4, Inflation = 12},
        new {Country = "CHI", GDP = 5, Inflation = 12},
        new {Country = "CAN", GDP = 6, Inflation = 12},
    };

var people = from x in economics
             let c = x.Inflation/x.GDP
             orderby c
             select c;

// without "orderby c":  12, 6, 4, 3, 2, 2
// with "orderby c":  2, 2, 3, 4, 6, 12
Console.WriteLine(string.Join(", ", people));

这可能是 Linq-to-Excel 的一个缺陷。(我无法对此进行测试。)

如果是这种情况,您可以强制评估(通过.ToArray()下面),然后对其进行排序。作为使用 LINQ 的任何静态数据的使用者,我希望调用ToArray是不必要的。

var people = from x in economics
             let c = x.Inflation/x.GDP
             select c;

var sorted = people.ToArray().OrderBy(c => c);
Console.WriteLine(string.Join(", ", sorted));
于 2013-06-04T17:55:50.907 回答
2

如果您只想按 排序Inflation / GDP,您可以这样做:

var people = from x in excel.Worksheet<CountryEconomics>("Sheet1")
             orderby x.Inflation / x.GDP
             select x;

或流利的语法:

var people = excel.Worksheet<CountryEconomics>("Sheet1")
                  .OrderBy(x => x.Inflation / x.GDP);

我不确定,但您可能需要跳过第一行(有标题)。

var people = excel.Worksheet<CountryEconomics>("Sheet1")
                  .Skip(1).OrderBy(x => x.Inflation / x.GDP);
于 2013-06-04T17:52:41.813 回答
1

现在,我只是在猜测,但也许添加一些演员表可以使它起作用:

var people = from x in excel.Worksheet<CountryEconomics>("Sheet1")
             let c = ((double)x.Inflation) / ((double)x.GDP)
             orderby c ascending 
             select c;

但是,如果这也失败了 - 如果您先将其列为列表会发生什么:

var people = from x in excel.Worksheet<CountryEconomics>("Sheet1").ToList()
             let c = ((double)x.Inflation) / ((double)x.GDP)
             orderby c ascending
             select c;

如果仍然失败:

var people = from x in excel.Worksheet<CountryEconomics>("Sheet1")
             let c = ((double)x.Inflation) / ((double)x.GDP)
             select c;

var peopleList = people.ToList().OrderBy(p => p);

希望这能完成...

于 2013-06-04T18:21:02.620 回答