Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 排序地址列表_C#_Asp.net_Linq - Fatal编程技术网

C# 排序地址列表

C# 排序地址列表,c#,asp.net,linq,C#,Asp.net,Linq,我已经创建了一个包含许多地址的列表。我想对列表进行排序,以便它们按数字顺序显示,即 1 Abbey Road 2 Abbey Road 3 Abbey Road 10 Abbey Road 我试过list.sort,它是按字母顺序排列的,因此10出现在2之前 我的linq是有限的,所以我想可能有一种方法可以使用它或使用正则表达式 有什么想法吗?您可以使用Linq的OrderBy()排序: 其中,street是带有街道名称的字符串,comparer是一个IComparer,可以按照您想要的方式

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

1 Abbey Road 
2 Abbey Road
3 Abbey Road
10 Abbey Road
我试过list.sort,它是按字母顺序排列的,因此10出现在2之前

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


有什么想法吗?

您可以使用Linq的
OrderBy
()排序:

其中,
street
是带有街道名称的字符串,
comparer
是一个
IComparer
,可以按照您想要的方式对它们进行排序。要对字符串进行数字排序,您可以查看以下内容: 试试这个:-

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

如果您希望按排序方法对其进行排序,则需要实现接口:-

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);
        }
    }

.

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

public class Address
{
    public string FullAddress { get; set; }
    public int Number { get; set; }
    public string Street { get; set; }
}
现在基本上只需使用
String.Split
int.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();
请注意,
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();
整数;
列表地址=字符串。选择(s=>new{
FullAddress=s.Trim(),
令牌=s.Trim().Split()
})
.选择(x=>新地址{
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();

这是单个字段,还是将街道号码存储在单独的字段中?另外,您使用的是哪种LINQ提供程序(LINQ到对象、LINQ到SQL、LINQ到实体)?它是一个字段,只是一个包含整个地址的字符串。我正在使用/导入System.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();
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();