我有两张桌子,两张桌子都带有手机栏。
此列-NVARCHAR(30) - 可以以多种不同方式格式化其存储数据,从 0001 222 333 444 到 222 333 444 到( 0001)-222333444 到 - 甚至是一个空字符串。
我想使用LINQ进行查询,其中上面显示的前三个示例会给出匹配,所以我需要摆脱所有不是数字的东西,然后从中获取最后9位数字。串。但是,我还没有能够只使用一个查询来执行此操作,而是循环浏览每个结果并在那里应用电话号码过滤器。有没有办法只用查询来完成?
答案 0 :(得分:3)
String
基本上是IEnumerable<char>
,所以你可以做的是:
var digits = s.Where(char.IsDigit);
现在,没有真正优雅的方法来取最后9位:IEnumerable<>
意味着除了迭代它之外没有办法找出它的长度。我可以建议的是:
var digits = new string(s.Where(char.IsDigit).Reverse().Take(9).Reverse().ToArray());
或者你可以得到所有想象力并编写自己的TakeLast()
扩展方法:
public static IList<T> TakeLast<T>(this IEnumerable<T> enumerable, int n)
{
var queue = new Queue<T>(n);
foreach(var item in enumerable)
{
queue.Enqueue(item);
if(queue.Count > n)
queue.Dequeue();
}
return queue.ToList();
}
这将大大简化您的代码:
var digits = new string(s.Where(char.IsDigit).TakeLast(9).ToArray());
答案 1 :(得分:0)
与Jonesopolis的回答类似,您可以执行以下操作以从字符串中获取最后N个字符:
var str = "0001 222 333 444";
var n = 9;
var result = string.Concat(str.Where(char.IsDigit).Skip(str.Length - n).Take(n));
这将跳过前几个字符并拉回最后n
个字符。您可能需要对字符串长度进行测试以确保字符串包含足够的字符 - 我没有对此进行测试,因此如果字符串太短,则可能会引发错误。
答案 2 :(得分:0)
假设EntityFramework映射类如:
public class Person
{
public int Id { get; set; }
public string Phone { get; set; }
}
和包含
的EF上下文public DbSet<Person> Persons
您可以使用
之类的内容进行过滤var ppl = context.Persons.Where(x => x.Phone.Replace(" ", "").EndsWith("222333444")).ToList();
这将生成如下所示的SQL,满足您对过滤解决方案的要求。
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Phone] AS [Phone]
FROM [dbo].[People] AS [Extent1]
WHERE REPLACE([Extent1].[Phone], N' ', N'') LIKE N'%222333444'
然后,可以在中间层/模型构建器/自动图样式解决方案中应用任何格式。
答案 3 :(得分:0)
Regex&amp; amp; LINQ:
Regex r1 = new Regex("[^0-9.]");
Regex r2 = new Regex("(.{9})$");
var Last9Digits = PhoneNumbers.Select(PhoneNo => r2.Match(r1.Replace(PhoneNo, "")));
答案 4 :(得分:0)
/// <summary>
/// Get the last N characters of a string.
/// </summary>
public static string GetLast(this string source, int numberOfChars)
{
if (string.IsNullOrEmpty(source) || numberOfChars >= source.Length)
return source;
return source.Substring(source.Length - numberOfChars);
}