LINQ查询以检查邮政编码是不是在起始和结束邮政编码范围内?

Posted

技术标签:

【中文标题】LINQ查询以检查邮政编码是不是在起始和结束邮政编码范围内?【英文标题】:LINQ query to check if a postcode is within a range of starting and ending postcodes?LINQ查询以检查邮政编码是否在起始和结束邮政编码范围内? 【发布时间】:2011-11-03 01:11:23 【问题描述】:

我需要使用 linq 检查邮政编码是否在给定的开始和结束邮政编码内。

这是我到目前为止所拥有的,但它根本不对,有人能指出我正确的方向吗?

List<DestinationStation> stations = DestinationStation.GetDestinationStations();
var query = from s in stations
            where postcode <= s.FromPostcode && postcode >= s.ToPostcode
            select s;
Console.WriteLine(query.ToList());

【问题讨论】:

通常邮政编码为字符串格式以适应“0213”。所以只是检查邮政编码的数据值是多少,你能举个例子吗?有时邮政编码包含字母数字 您说要检查 a 邮政编码,但您的代码似乎检查了一个邮政编码所属的范围。你到底想要什么?您当前的代码有什么问题?您的邮政编码是什么数据类型,可能的值是什么?您是否在了解美国邮政编码或其他信息? 邮政编码为英国格式 TW4 6JS 我有一系列邮政编码,我需要查看我传入的邮政编码是否属于 fromPostcode 和 toPostCode。 所以你有一个范围?为什么你的代码有一个范围列表呢?再说一遍,您当前的代码有什么问题? 我有一个 List 每个 DestinationStation 对象都有一个 FromPostcode 和一个 ToPostcode,它们是字符串。我需要检查给定的邮政编码是否在给定 DestinationStation 对象的任何 FromPostcodes 和 ToPostcodes 内...有意义吗? 【参考方案1】:

尝试CompareTo 获取字符串。这行得通吗?

var query =
    from s in stations
    where postcode.CompareTo(s.FromPostcode) >= 0
    where postcode.CompareTo(s.ToPostcode) <= 1
    select s;

【讨论】:

@CarlWeis - 更改为支持字符串。 为什么要使用CompareTo() 而不是普通的比较运算符,如&gt;=&lt; 用于字符串? @svick - 因为在使用字符串进行比较时出现此错误“运算符'>='不能应用于'字符串'和'字符串'类型的操作数”。 @svick &gt;=&lt; 不是字符串的正常比较运算符。它们不存在。 这不适用于以下情况: - 需要一个数字邮政编码,但包含一个 alpha 字符 - 需要一个 4 字符的邮政编码,但给定一个 5 字符的邮政编码【参考方案2】:

我假设字符串的自然顺序就是您所说的“介于”之间。如果不是这样,您应该查看 IComparable 接口以更好地控制排序。

我还进行了排他性比较。不过,您可以更改运算符以使其具有包容性。

    class Program

    static void Main(string[] args)
    
        var postcode = "B";
        var stations = DestinationStation.GetDestinationStations();
        var query = from s in stations
                    where postcode.CompareTo(s.FromPostcode) > 0 && postcode.CompareTo(s.ToPostcode) < 0
                    select s;
        Console.WriteLine(query.ToList());
    

public class DestinationStation

    public string FromPostcode;
    public string ToPostcode;

    public static List<DestinationStation> GetDestinationStations()
    
        return new List<DestinationStation>    new DestinationStation FromPostcode = "A", ToPostcode = "C",
                                                new DestinationStation FromPostcode = "A", ToPostcode = "A",
                                                new DestinationStation FromPostcode = "C", ToPostcode = "C",
                                                new DestinationStation FromPostcode = "C", ToPostcode = "A",
        ;
    

【讨论】:

【参考方案3】:

假设您使用的邮政编码是整数或类似的(并非所有邮政编码都如此,例如英国邮政编码类似于 SW1A 1AA)。

Console.WriteLine( stations.Any(station => postCode >= station.FromPostcode && station <= station.ToPostcode) );

编辑:

由于英国邮政编码定义了四个不同级别的地理单位,您需要将组成部分分开,以便进行比较。

【讨论】:

【参考方案4】:

我有一个 List,其中每个 DestinationStation 对象都有一个 FromPostcode 和一个 ToPostcode,它们是字符串。我需要检查给定的邮政编码是否在给定 DestinationStation 对象的 FromPostcodes 和 ToPostcodes 的 any 内...有意义吗?

(我的重点)

听起来您想使用Any 运算符。它返回true 是否找到'any',否则返回false

List<DestinationStation> stations = DestinationStation.GetDestinationStations(); 
var exists = stations.Any(s => 
    postcode <= s.FromPostcode && postcode >= s.ToPostcode);

if (exists)
    Console.WriteLine("It's within a range");

如果您想查找您的邮政编码是在哪个范围内找到的,请执行 where / single / first。

var all = stations.Where(s => 
    postcode <= s.FromPostcode && postcode >= s.ToPostcode);

var first = stations.First(s => 
    postcode <= s.FromPostcode && postcode >= s.ToPostcode);

var only = stations.Single(s => 
    postcode <= s.FromPostcode && postcode >= s.ToPostcode);

【讨论】:

以上是关于LINQ查询以检查邮政编码是不是在起始和结束邮政编码范围内?的主要内容,如果未能解决你的问题,请参考以下文章

格式化英国邮政编码以进行存储

检查邮政编码是不是在范围内

邮政编码查询

在mysql中匹配长字符串(完整邮政编码)与短字符串(邮政编码开头)

邮政地址和客户编号的 Elasticsearch 部分匹配

geoip邮编查询