按列表中的属性进行分组,并按其他属性对这些分组元素进行排序,而不会影响原始分组

时间:2016-01-11 17:50:12

标签: c# linq

嗨我有一份体育比赛清单,我希望按比赛进行分组,然后按开始时间排序,而不影响c#比赛的分组(比赛分组,然后排序开始日期):

基本上我需要的是这个:

Match            Start Time Competition

red vs blue        17:40    league 1
yellow vs green    15:00    league 2
brown vs orange    12:00    league 1
purple vs maroon   20:00    league 3
gold vs silver     16:45    league 1
white vs black     19:00    league 3
grey vs navy       18:00    league 1

转换成这个:

Match         Start Time    Competition

brown vs orange    12:00    league 1
gold vs silver     16:45    league 1
red vs blue        17:40    league 1
grey vs navy       18:00    league 1
yellow vs green    15:00    league 2
white vs black     19:00    league 3
purple vs maroon   20:00    league 3

我目前的代码不起作用,我不知道下一步该去哪里。任何想法将不胜感激。以下是代码:

  var matchListSorted =
                        list1.GroupBy(rows=> rows.Competition)
                            .SelectMany(row=> row.OrderBy(rows=> rows.ExpectedOffDate))
                            .ToList();

编辑此代码目前按比赛分组,但后来忽略它,支持按开始时间排序,如下所示

Match            Start Time   Competition
brown vs orange     12:00   league 1
yellow vs green     15:00   league 2
gold vs silver      16:45   league 1
red vs blue         17:40   league 1
grey vs navy        18:00   league 1
white vs black      19:00   league 3
purple vs maroon    20:00   league 3

2 个答案:

答案 0 :(得分:1)

不确定我的答案是否会被视为非主题,但我能够通过仅按顺序进行分组来实现结果。

[TestClass]
public class LinqTests {

    [TestMethod]
    public void Linq_Sort() {
        var input = new[] 
        { 
        new {Match="red vs blue",StartTime="17:40",Competition="league 1"},
        new {Match="yellow vs green",StartTime="15:00",Competition="league 2"},
        new {Match="brown vs orange",StartTime="12:00",Competition="league 1"},
        new {Match="purple vs maroon",StartTime="20:00",Competition="league 3"},
        new {Match="gold vs silver",StartTime="16:45",Competition="league 1"},
        new {Match="white vs black",StartTime="19:00",Competition="league 3"},
        new {Match="grey vs navy",StartTime="18:00",Competition="league 1"},
        };

        var matchListSorted = (from match in input
                               orderby match.Competition, match.StartTime                                  
                               select match);


        var result = matchListSorted.ToList();
    }
}

得到以下结果

+       [0] { Match = "brown vs orange", StartTime = "12:00", Competition = "league 1" }    <Anonymous Type>
+       [1] { Match = "gold vs silver", StartTime = "16:45", Competition = "league 1" } <Anonymous Type>
+       [2] { Match = "red vs blue", StartTime = "17:40", Competition = "league 1" }    <Anonymous Type>
+       [3] { Match = "grey vs navy", StartTime = "18:00", Competition = "league 1" }   <Anonymous Type>
+       [4] { Match = "yellow vs green", StartTime = "15:00", Competition = "league 2" }    <Anonymous Type>
+       [5] { Match = "white vs black", StartTime = "19:00", Competition = "league 3" } <Anonymous Type>
+       [6] { Match = "purple vs maroon", StartTime = "20:00", Competition = "league 3" }   <Anonymous Type>

然后以这种方式尝试并获得相同的结果     

[TestMethod]
public void Linq_GroupSort() {
    var input = new[] 
    { 
    new {Match="red vs blue",StartTime="17:40",Competition="league 1"},
    new {Match="yellow vs green",StartTime="15:00",Competition="league 2"},
    new {Match="brown vs orange",StartTime="12:00",Competition="league 1"},
    new {Match="purple vs maroon",StartTime="20:00",Competition="league 3"},
    new {Match="gold vs silver",StartTime="16:45",Competition="league 1"},
    new {Match="white vs black",StartTime="19:00",Competition="league 3"},
    new {Match="grey vs navy",StartTime="18:00",Competition="league 1"},
    };

    var matchListSorted = (from match in input
                           orderby match.Competition
                           group match by match.Competition into g
                           select g).SelectMany(g => g.OrderBy(m => m.StartTime));


    var result = matchListSorted.ToList();
}

答案 1 :(得分:0)

我工作的原始代码

var matchListSorted =
                    list1.GroupBy(rows=> rows.Competition)
                        .SelectMany(row=> row.OrderBy(rows=> rows.ExpectedOffDate))
                        .ToList();

我不知道为什么它在前几次不起作用。几个小时后,我尝试使用相同的代码添加测试数据(包括原始数据)并且它有效。