摆脱非数字,然后在LINQ

时间:2015-08-24 15:40:41

标签: c# sql string linq

我有两张桌子,两张桌子都带有手机栏。

此列-NVARCHAR(30) - 可以以多种不同方式格式化其存储数据,从 0001 222 333 444 222 333 444 ( 0001)-222333444 - 甚至是一个空字符串。

我想使用LINQ进行查询,其中上面显示的前三个示例会给出匹配,所以我需要摆脱所有不是数字的东西,然后从中获取最后9位数字。串。但是,我还没有能够只使用一个查询来执行此操作,而是循环浏览每个结果并在那里应用电话号码过滤器。有没有办法只用查询来完成?

5 个答案:

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