【问题标题】:ordering a list of addresses订购地址列表
【发布时间】:2014-11-06 11:49:12
【问题描述】:

我创建了一个包含多个地址的列表。我想对列表进行排序,以便它们按数字顺序显示,即

1 Abbey Road 
2 Abbey Road
3 Abbey Road
10 Abbey Road

我尝试过 list.sort - 它按字母顺序排列,但因此 10 出现在 2 之前。

我的 linq 是有限的,所以我想可能有一种方法可以使用它或使用正则表达式。

有什么想法吗?

【问题讨论】:

  • 这是单个字段,还是您将街道号码存储在单独的字段中?另外,您使用的是哪种 LINQ 提供程序(Linq-To-Objects、Linq-To-SQL、Linq-To-Entities)?
  • 它是一个字段,只是一个包含整个地址的字符串。我只是在使用/导入 System.Linq

标签: c# asp.net linq


【解决方案1】:

可以使用Linq的OrderBy(http://msdn.microsoft.com/en-us/library/vstudio/bb549422%28v=vs.110%29.aspx)排序:

list.OrderBy(street => street, comparer);

其中street 是带有街道名称的字符串,comparerIComparer,可以按照您想要的方式对它们进行排序。要对字符串进行数字排序,您可以在这里查看: Sorting a List of Strings numerically (1,2,...,9,10 instead of 1,10,2)

【讨论】:

    【解决方案2】:

    如果您不将街道号码存储在单独的字段中,但您希望它位于第一个位置,则可以使用具有有意义属性的此类来提取所有信息:

    public class Address
    {
        public string FullAddress { get; set; }
        public int Number { get; set; }
        public string Street { get; set; }
    }
    

    现在基本上你只需要使用String.Splitint.Parse,例如在这个LINQ查询中:

    List<Address> addresses = strings.Select(s => new {
        FullAddress = s.Trim(),
        Tokens = s.Trim().Split()
    })
    .Where(x => x.Tokens.Length > 1 && x.Tokens[0].All(Char.IsDigit))
    .Select(x => new Address {
        FullAddress = x.FullAddress,
        Street = String.Join(" ", x.Tokens.Skip(1)),
        Number = int.Parse(x.Tokens[0])
    })
    .OrderBy(addr => addr.Number)
    .ToList();
    

    如果您不想选择此类,而只想选择正确顺序的字符串,则必须将查询的结尾更改为:

    .OrderBy(addr => addr.Number)
    .Select(addr => addr.FullAddress)
    .ToList();
    

    注意Where 过滤器,因此“无效”地址被跳过。如果不需要,您可以使用:

    int number;
    List<Address> addresses = strings.Select(s => new { 
        FullAddress = s.Trim(), 
        Tokens = s.Trim().Split() 
    })
    .Select(x => new Address{
        FullAddress = x.FullAddress,
        Street = String.Join(" ", x.Tokens.Skip(1)),
        Number = int.TryParse(x.Tokens[0], out number) ? number : int.MaxValue
    })
    .OrderBy(addr => addr.Number)
    .ToList();
    

    【讨论】:

      【解决方案3】:

      试试这个:-

      var sortedList = addr.OrderBy(x => x.ID).ToList();
      

      Fiddle.

      如果你希望通过Sort方法对其进行排序,那么你需要实现IComparable接口:-

      public class Address : IComparable<Address>
          {
              public int ID { get; set; }
              public string Add { get; set; }
      
              public int CompareTo(Address other)
              {
                  return this.ID.CompareTo(other.ID);
              }
          }
      

      那么你可以这样做:-

      addr.Sort();
      

      SortFiddle.

      【讨论】:

        猜你喜欢
        • 2020-01-10
        • 2017-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多