我有一个表(如数字列表),该表通过一系列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
我想做的是根据
ColumnLabels
在Value
的基础上以降序对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对其中的元素进行排序(因为它们代表列)。