【问题标题】:Sort list with LINQ使用 LINQ 排序列表
【发布时间】:2013-11-19 17:29:22
【问题描述】:

今天我刚刚试用了 LINQ 框架,想知道是否有办法做到以下几点。 我有一个包含街道名称和门牌号码的地址列表。首先,我根据他们的街道名称列出所有地址

list = list.OrderBy(x => x.StreetName)

如果街道名称相同,我也想使用ThenBy-表达式比较门牌号,但问题是门牌号可能由两部分组成:整数(例如 12)和字符串后缀(例如 A) 导致 12A。所以我想对门牌号(int 值)的列表进行排序,然后再对后缀(字符串值)进行排序。我还创建了正则表达式来将 housenumber 拆分为 int- 和 string 值,所以这不是问题,这里是:(\d+) *(\S)* 但我没有遇到这两个值(在某些情况下只有一个作为LINQ 的排序也没有后缀。

我有什么办法吗?

【问题讨论】:

  • 按数字后跟字母的整个字符串排序将产生与先数字后字母排序完全相同的结果。
  • 也许为门牌号编写一个小的自定义比较器比像那样乱七八糟更容易。但是,尽管如此,比较 @AntP 提到的字符串实际上是您需要的。
  • @AntP 如果按字符串排序 - "15">"123"
  • @Grundy D'oh - 非常正确。
  • 你为什么要把这两件事分开?不是每个房子都有门牌号。有些只是有名字。这就是为什么几乎每个网站/系统都有“第一行地址”的原因。假设有一个数字和一个可能的后缀会产生比您需要的更多的工作。

标签: c# linq sorting


【解决方案1】:

更好的方法是让您的类实现 IComparable 接口。然后你可以调用一个 Sort 就完成了。

// something like this
class Address  : IComparable<Address>
{
    public int Housenumber { get; set; }
    public string HousenumberExtra { get; set; }

    public int CompareTo(Address other)
    {
        var compareResult = Housenumber.CompareTo(other.Housenumber);

        if (compareResult == 0)
            return HousenumberExtra.CompareTo(other.HousenumberExtra);

        return compareResult;
    }
}

如果你真的想使用 linq,你可以这样做(多个 ThenBy)

var result = addresses
    .OrderBy(i => i.Streetname)
    .ThenBy(h => h.Housenumber)
    .ThenBy(he=> he.HousenumberExtra);

【讨论】:

  • 这个答案将从示例中受益。
  • 我也玩过这个主意,我怕我就是这样做的
  • @HimBromBeere 不用怕 :) 你可以用windows自带的Natual sort来比较字符串
  • 不,我担心的真正原因是因为我必须从我想要排序的类派生,因为我不允许更改这个基类......但是然后将派生类型放到列表有点复杂......但是这是另一个问题。顺便说一句:这是我目前使用的实际方式......
  • 可以,或者是,类部分?
【解决方案2】:

我目前的方法如下所示,可以满足我的需求,但可能不是最好的:

buildings.Sort(delegate(Adress g1, Adress g2)
{
    int compare = String.Compare(g1.StreetName, g2.StreetName);
    if (compare == 1 || compare == -1) return compare;

    else {
        // ...
        // split the housenumber into int and string part using a regex
        // ...
        if h1 < h2 return -1;  // h1 and h2 are the numbers
        else if h1 > h2 return 1;
        else return String.Compare(suffix1, suffix2); 

    };
});

希望有一个使用 LINQ 的解决方案,因为这可能会更短一些,但显然没有......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2010-10-11
    相关资源
    最近更新 更多