【问题标题】:How to sort list of strings by length in place using List<string>.Sort?如何使用 List<string>.Sort 按长度对字符串列表进行排序?
【发布时间】:2013-12-11 13:31:56
【问题描述】:

我想按字符串的长度对字符串列表进行排序

var weasleys = new List<string>{"Bill", "Charlie", "Percy", "Fred", "George", "Ron", "Ginny"};

我知道如何使用 OrderBy,但这会返回一个副本。

weasleys.OrderBy(x => x.Length)

我更喜欢使用List&lt;T&gt;.Sort 进行就地排序。怎么样?

【问题讨论】:

  • 为什么不能像以前那样使用 OrderBy?
  • 您必须使用自定义比较器到您的T 类。

标签: c# .net sorting


【解决方案1】:

有一个Sort(Comparison&lt;T&gt;) overload 接受Comparison&lt;T&gt; 委托。这样,您就可以在各自的 Length 值上使用 CompareTo 方法:

weasleys.Sort((x, y) => x.Length.CompareTo(y.Length));

请注意,与 LINQ OrderBy 方法不同,Sort 将在您的意图下就地更改您的 weasleys 列表。

【讨论】:

    【解决方案2】:

    应该这样做

    var weasleys = new List<string>{"Bill", "Charlie", "Percy", "Fred", "George", "Ron", "Ginny"};
    var t = weasleys.OrderBy(x => x.Length).ToList<string>();
    

    【讨论】:

      【解决方案3】:

      您可以使用数组列表来做到这一点...

      public class SortStringLength : IComparer
          {
              public int Compare(Object s1, Object s2)
              {
                  if (s1.ToString().Length == s2.ToString().Length)
                      return String.CompareOrdinal(s1.ToString(), s2.ToString());
                  if (s1.ToString().Length > s2.ToString().Length)
                      return 1;
                  return -1;
              }
          }
      

      然后,使用IComparer...

      static void Main(string[] args)
              {
                  var weasleys = new ArrayList { "Bill", "Charlie", "Percy", 
                        "Fred", "George", "Ron", "Ginny" };
                  var sortLength = new SortStringLength();
                  weasleys.Sort(sortLength);
      
                  foreach (var weasley in weasleys)
                  {
                      Console.WriteLine(weasley);
                  }
      
                  Console.ReadLine();
              }
      

      有列表...

      public class SortStringLength : IComparer<string>
      {
          public int Compare(string x, string y)
          {
              if (x.Length == y.Length)
                  return String.CompareOrdinal(x, y);
              if (x.Length > y.Length)
                  return 1;
              return -1;
          }
      }
      

      和用法...

      static void Main(string[] args)
              {
                  var weasleys = new List<string> { "Bill", "Charlie", "Percy", 
                             "Fred", "George", "Ron", "Ginny" };
                  var sortLength = new SortStringLength();
                  weasleys.Sort(sortLength);
      
                  foreach (var weasley in weasleys)
                  {
                      Console.WriteLine(weasley);
                  }
      
                  Console.ReadLine();
              }
      

      【讨论】:

        【解决方案4】:
        using System;
        using System.Collections.Generic;
        using System.Text;
        using System.Linq;
        
        public class Program
        {
            public static void Main()
            {
                List<string> dictionary = new List<string>() { "aaa", "aaaa", "a", "aa" };
                var orderedDic = dictionary.Select(x => new
                  {
                    val = x,
                    length = x.Length
                  }).OrderBy(x => x.length).ToList();
                dictionary = orderedDic.Select(x => x.val).ToList();
                Console.WriteLine(string.Join(",", dictionary));
             }
        }
        

        我在这里使用的方法

        1. 使用 val 和 length 属性创建了一个匿名对象列表。
        2. 按长度排序。

        【讨论】:

        • 我怀疑您的答案被否决了,因为它比接受的答案复杂得多,并且没有进行就地排序。
        • 实现相同的方法有很多种,我给出了不同的思路。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 2018-02-23
        相关资源
        最近更新 更多