我有一个表(如数字列表),该表通过一系列linq查询重新创建。我正在尝试根据第一行中的值以降序对列进行排序。

我的数据库如下所示:

Data
{
   ColumnLabel,
   RowLabel,
   Value
}

{"Cat", "All", 9}
{"Dog","All", 17}
{"Fish", "All", 4}

{"Cat", "Girls", 3}
{"Dog","Girls", 2}
{"Fish", "Girls", 2}

{"Cat", "Boys", 6}
{"Dog","Boys", 15}
{"Fish", "Boys", 2}


当我天真地将此表连接在一起时,它看起来像这样:

      Cat | Dog | Fish
All    9     17     4
Girls  3     15     2
Boys   6     2      2


我想做的是根据ColumnLabelsValue的基础上以降序对RowLabel == "All"进行排序。我希望表格看起来像这样:

      Dog | Cat | Fish
All    17    9     4
Girls  15    3     2
Boys   2     6     2


注意“猫狗”行已翻转。

我需要使用HTML将该表放出来,以便逐行进行遍历。

我首先对ColumnLabels进行排序:

var top = data.Where(x => x.RowLabel ==“全部”)
               .OrderBy(x => x.Data)
               .Select(x => x.ColumnLabel).SingleOrDefault();

现在,top包含我希望列显示的顺序; {Dog, Cat, Fish}。我不在乎行如何垂直排列。

然后,我要做的是根据它的RowLabel值对每一行进行分组:

var row = data.GroupBy(x => x.RowLabel)
          .OrderBy(y => ??????????????);
          //I want to OrderBy the values in top
          //How do I do this?


然后,我遍历每一行并创建我的HTML表。这部分很容易,但是我不知道如何根据最高顺序对后续行进行排序。如何在LINQ中做到这一点?

最佳答案

我相信这将满足您的要求:

var order = data
    .Where(x => x.RowLabel == "All")
    .OrderByDescending(x => x.Value)
    .Select((x, i) => new { x, i })
    .ToDictionary(x => x.x.ColumnLabel, x => x.i);
var result = data
    .GroupBy(x => x.RowLabel, (x, y) => y.OrderBy(z => order[z.ColumnLabel]));

foreach (var x in result)
{
    foreach (var y in x)
    {
        Console.WriteLine("ColumnLabel: {0}, RowLabel: {1}, Value: {2}", y.ColumnLabel, y.RowLabel, y.Value);
    }
}


结果:

ColumnLabel: Dog, RowLabel: All, Value: 17
ColumnLabel: Cat, RowLabel: All, Value: 9
ColumnLabel: Fish, RowLabel: All, Value: 4
ColumnLabel: Dog, RowLabel: Girls, Value: 2
ColumnLabel: Cat, RowLabel: Girls, Value: 3
ColumnLabel: Fish, RowLabel: Girls, Value: 2
ColumnLabel: Dog, RowLabel: Boys, Value: 15
ColumnLabel: Cat, RowLabel: Boys, Value: 6
ColumnLabel: Fish, RowLabel: Boys, Value: 2


如果我误解了您的问题,请告诉我,但是这里的想法是创建一个字典order,该字典为随后的分组查询提供排序。另一个关键思想是使用group-by的resultSelector对其中的元素进行排序(因为它们代表列)。

08-25 12:10
查看更多