【问题标题】:How To Sort A List Of Lists?如何对列表列表进行排序?
【发布时间】:2010-06-23 17:32:40
【问题描述】:

我有一个想要排序的列表。

    foreach (var Row in Result)
    {
        foreach (var RowAll in Row.All)
        {
            DataObject.Add(new List<string>() { RowAll.Value1, RowAll.Value2, RowAll.Value3});
            break; 
        }
    }

现在我想按每个子列表的 Value2 对父列表进行排序。 这可能吗?如果是这样,我该怎么做?

【问题讨论】:

    标签: c# list linq


    【解决方案1】:

    我设法让这个工作:

    listOfLists = listOfLists.OrderByDescending(a => a.Max(x => x.paramToSoryBy)).ToList();
    

    【讨论】:

      【解决方案2】:

      您可以通过 LINQ 做到这一点:

       // I'm assuming here that "LastCheckin" is defined as List<List<string>> or similar
       // ...
      
       var sorted = Data.LastCheckin.OrderBy(list => list[1]);
      

      这将返回一个IEnumerable&lt;List&lt;string&gt;&gt;,其中包含按子列表中的第二个值 (Value2) 排序的“列表”。


      如果您想对列表进行适当的排序,您可以改用List&lt;T&gt;.Sort

       Data.LastCheckin.Sort( (a,b) => a[1].CompareTo(b[1]) );
      

      如果您需要在运行时指定升序或降序,一个简单的处理方法是:

       bool ascending = true; // Set to false for decending
      
       int mult = ascending ? 1 : -1;
       Data.LastCheckin.Sort( (a,b) => mult * a[1].CompareTo(b[1]) );
      

      为了处理更复杂的检查,您可以将 lambda 拆分为多行:

       bool ascending = true; // Set to false for decending
       string myDateFormat = GetDateFormat(); // Specify date format
      
       int mult = ascending ? 1 : -1;
       Data.LastCheckin.Sort( (aStr,bStr) => 
          {
              DateTime a, b;
              bool aSuccess = DateTime.TryParseExact(aStr[1], myDateFormat, DateTimeStyles.None, CultureInfo.InvariantCulture, out a);
              bool bSuccess = DateTime.TryParseExact(bStr[1], myDateFormat, DateTimeStyles.None, CultureInfo.InvariantCulture, out b);
      
              int result;
              if (!aSuccess)
                  result = bSuccess ? -1 : 0;
              else if (!bSuccess)
                  result = 1;
              else
                  result = a.CompareTo(b);
      
              return mult * result;
      
          });
      

      这会处理 a 和 b 上的解析器故障,并应将它们放在排序的末尾。

      【讨论】:

      • @Reed,非常感谢!我的代码中的这一点已经困扰了我很长一段时间。
      • @Reed Copsey:我排序的值仍然是字符串格式,所以它是按字符串格式而不是日期格式排序的。我怎样才能让它工作,以便按值的日期格式排序?
      • @Soo:您需要先将数字转换为日期 - 即:在排序 lambda 中,将 a 和 b 转换为日期(使用 DateTime.Parse/TryParse),然后比较日期.
      • 当我使用 DateTime.Parse 时,我收到一条错误消息:字符串未被识别为有效的 DateTime
        这是我的日期的样子:
        2010-06- 26 10:30:00.000
      • @Soo:您需要使用 DateTime.ParseExact 并提供格式。
      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2015-12-03
      • 2020-12-23
      • 2012-08-31
      • 2015-03-21
      • 1970-01-01
      相关资源
      最近更新 更多