【问题标题】:Alphabetize list by using last 3 characters with C#? [closed]使用 C# 的最后 3 个字符按字母顺序排列列表? [关闭]
【发布时间】:2020-09-16 16:40:48
【问题描述】:

我有一个这样的字符串列表:

  1. 123.45 ABC
  2. 678.90 后卫
  3. 543.21 美联储

我想使用每个列表元素的最后 3 个字符按字母顺序对列表进行排序。

编辑:使用 C#,我如何通过使用每个元素的最后 3 个字符来按字母顺序排列这个列表?

【问题讨论】:

  • OrderBy(x => x.Substring(x.Length - 3) 表示最后 3 个 OrderBy(x => x.Substring(N)) 表示从第 N 个字符开始
  • @juharr,不幸的是,这对列表进行了数字排序
  • @paulsm4 我会试一试,谢谢,如果可行,我会通知你
  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Ask,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。您必须做出诚实的尝试,然后针对您的算法或技术提出具体问题。

标签: c# list sorting alphabetical


【解决方案1】:

我首先要做的是确保过滤掉所有少于 3 个字符的字符串。然后我将它们排序为:

var items = new List<string> { "13 zzz", "12 yyy", "11 zzz" };

items = items.Where(i => i.Length > 2)
             .OrderBy(i => i.Substring(i.Length - 3))
             .ToList();

【讨论】:

  • 效果很好,非常感谢!
  • 你是对的。让我解决它:)
【解决方案2】:

要按最后三个字符排序,您可以从 Length - 3 开始获取 Substring 并在 OrderBy 方法中使用它(请注意,我们应该首先检查 item.Length &gt; 2 以便 Substring 不't throw an execption):

var items = new List<string> {"543.21 FED", "123.45 ABC", "678.90 DEF"};

items = items
    .OrderBy(item => item?.Length > 3 ? item.Substring(item.Length - 3) : item)
    .ToList();

// result: {"123.45 ABC", "678.90 DEF", "543.21 FED"}

或者,您可以为字符串编写一个自定义比较器,然后将其传递给Sort 方法。我们可以为我们的比较器包含一个构造函数,它接收一个int,它指定我们想要从字符串末尾计算多少个字符以使其更灵活(例如,如果你想使用最后一个5 字符,或者最后一个2等)。

public class OrderByLastNChars : Comparer<string>
{
    public int N { get; set; }

    public OrderByLastNChars(int n)
    {
        N = n;
    }

    public override int Compare(string x, string y)
    {
        if (x == null) return y == null ? 0 : -1;
        if (y == null) return 1;
        var first = x.Length > N ? x.Substring(x.Length - N) : x;
        var second = y.Length > N ? y.Substring(x.Length - N) : y;
        return first.CompareTo(second);
    }
}

那么这可以像这样使用:

items.Sort(new OrderByLastNChars(3));

【讨论】:

  • 由于某种原因,这仍然只按数字对列表进行排序。 @Efthymios Kalyviotis 的回答奏效了。不过非常感谢!
  • 难道你的item?.Length 不应该通过合并到一个会使比较结果为假的值来解释 null 情况吗? IE。 item =&gt; (item?.Length ?? 0) &gt; 2 ? item.Substring(item.Length - 3) : item 或者它实际上是否像 SQL 那样在比较中接受一个可为空的值?
  • @RobParker 因为null &gt; 2 == false,所以不需要这样做(int 被编译器隐式转换为Nullable&lt;int&gt; 以进行比较)。
  • @Brydon 我们的答案是相同的,除了他的删除任何长度为 3 或更少的字符串。这是要求的一部分吗?
  • @RufusL 这不是一个要求,但他的工作..它是否删除长度为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 2013-05-14
  • 2013-07-14
  • 2020-03-29
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多