【问题标题】:Sort string array by element length按元素长度对字符串数组进行排序
【发布时间】:2013-12-03 22:25:36
【问题描述】:

有一个字符串数组,我如何更新它,使其元素按其长度排序。

我在尝试

string[] arr = {"aa","ss","a","abc"};
arr = arr.OrderBy(aux => aux.Length);

所以,我会得到a,aa,ss,abc,但它说

不能隐式转换类型'system.linq.iorderedenumerable 到字符串[]'

所以,我在做

foreach (string s in arr.OrderBy(str => str.Length))
{
    //
}

还有其他方法吗?

【问题讨论】:

    标签: c# .net arrays string sorting


    【解决方案1】:

    由于arr是一个数组,你可以使用方便的Array.Sort方法:

    Array.Sort(arr, (x, y) => x.Length.CompareTo(y.Length));
    foreach (string s in arr)
    {
        ...
    }
    

    这比OrderBy 更有效,因为它将对数组的元素进行就地排序,而不是创建一个新的集合来枚举。

    【讨论】:

    • 这是我找到的唯一方法,可以在不使用 Linq 且不创建另一个数组(或任何其他集合)的情况下对数组进行纵向排序。
    【解决方案2】:

    OrderBy 返回IEnumerable,而不是数组。使用ToArray方法获取数组:

    arr = arr.OrderBy(aux => aux.Length).ToArray();
    

    但是,它不会对源数组进行排序。取而代之的是,它将创建一个带有排序项目的新项目并替换参考。如果您需要就地排序(例如,当数组也被其他地方引用时)使用Array.Sort 方法:

    Array.Sort(x, (x1, x2) => x1.Length.CompareTo(x2.Length));
    

    【讨论】:

      【解决方案3】:

      您也可以使用 Linq 执行此操作,如下所示:

      var sortedElements = from arrElement in arr.Distinct()
                           orderby arrElement.Length
                           select arrElement;
      
      foreach (string element in sortedElements)
      {
           ...
      }
      

      【讨论】:

        猜你喜欢
        • 2016-04-23
        • 2016-02-09
        • 2015-01-16
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 2018-03-24
        • 1970-01-01
        • 2017-07-19
        相关资源
        最近更新 更多