C# Can';在linq比较中,我不知道如何忽略/在url的末尾

C# Can';在linq比较中,我不知道如何忽略/在url的末尾,c#,linq,C#,Linq,我想检查表中是否已经存在给定的url。 挑战在于数据库中的URL没有标准化 所以我想这样做: bool UrlAlreadyExists = db.Users.Any(u = u.Url .TrimEnd('/') .ToLower() .Replace("https://, "") .Replace("http://", "") .Replace("www", "") == newUrl .TrimEnd('/') .ToLower() .Replace("https://, "")

我想检查表中是否已经存在给定的url。 挑战在于数据库中的URL没有标准化

所以我想这样做:

bool UrlAlreadyExists = db.Users.Any(u = u.Url
.TrimEnd('/')
.ToLower()
.Replace("https://, "")
.Replace("http://", "")
.Replace("www", "") 

 == 
newUrl
.TrimEnd('/')
.ToLower()
.Replace("https://, "")
.Replace("http://", "")
.Replace("www", "");
);

但是,我不允许使用
TrimEnd()
,我不知道如何解决这个问题?

这些替换说明问题与最后的
/
无关。实际上,您希望匹配一个不能与SQL一起使用的特定模式。模式本身在
https
中读取
s
,并忽略
www
。修剪尾随的
/
很简单,您必须加载内存中的所有内容,以确定是否存在匹配项。此外,在一般情况下,带有www.prefix的URL不必指向与不带它的URL相同的IP地址。两个URL表示相同的概率高于99%,但不是100%。考虑到URL规范相当复杂,实际提出一个用于解析URL的正则表达式是一件非常复杂的事情。您最好使用
新Uri(uriFromOutside)
之类的方法,然后使用Uri对象来生成此对象的规范化版本。如果您希望获得良好的性能,则必须规范化数据库中的URL,并为包含规范化URL的字段编制索引。另一个选项是加载列表中的所有URL,并使用正则表达式查找匹配项。这比修剪和替换要快得多,修剪和替换会为每个输入字符串生成5个额外的字符串。字符串是不可变的,因此每个字符串操作都会创建一个新的string@JanThomäOP希望在忽略www的同时将http和https一视同仁。Uri构造函数本身是不够的,可能也不是正则表达式。这个过程非常昂贵,只需执行一次即可生成规范化的URL