通过使用.StartsWith和正则表达式过滤列表?

时间:2018-10-04 19:33:41

标签: c# asp.net .net regex linq

我上了这个课:

public class SimpleUser
{
    public int ProviderID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool ExistingUser { get; set; }
}

我有一个列表,该列表按对象中属性的首字母进行过滤。效果很好:

List<SimpleUser> filtersList = originalList.Where(s => s.LastName.StartsWith(alpaPage)).ToList();

但是,这是我的收获。无论出于何种原因,此数据中都有其中LastName不是字母的行。示例:Contractor #2,其中#2是姓氏。因此,在用户界面上,我为用户提供了一系列过滤选项。喜欢:

  • 123
  • A
  • B
  • C

等等如果他们单击A,B或C ...没问题。但是,如果他们单击123,现在我需要一个单独的过滤器来查找任何不以字母开头的LastName

我很确定这里会涉及到正则表达式,但是我没有看到如何将所有这些放在一起。

List<SimpleUser> filtersList = originalList.Where(s => s.LastName.StartsWith(?????)).ToList();

我相信我的正则表达式会

[^a-zA-Z]

但是如果我错了,请纠正我。所以我有:

var regEx = new Regex("[^a-zA-Z]");

但是之后。我迷路了。 .StartsWith(...似乎没有使用RegEx。我该如何格式化?!?

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为正则表达式对此有些大材小用。如评论中所述,对LastName的第一个字符进行简单的char.IsLetter检查就可以了:

List<SimpleUser> filtersList = 
    originalList.Where(s => !char.IsLetter(s.LastName[0])).ToList();

完整示例:

var originalList = new List<SimpleUser>()
{
    new SimpleUser() { LastName = "aaa" },
    new SimpleUser() { LastName = "bbb" },
    new SimpleUser() { LastName = "123" },
    new SimpleUser() { LastName = "#2" },
};

List<SimpleUser> filtersList = 
    originalList.Where(s => !char.IsLetter(s.LastName[0])).ToList();

foreach (var user in filtersList)
{
    Console.WriteLine(user.LastName);
}

输出:

123
#2

答案 1 :(得分:0)

您可以尝试以下简单代码:

List<string> strList = new List<string>() { "aBC", "1asdf", "123fasdf", "a1" };

strList = strList.Where(s => Regex.IsMatch(s, @"^[^a-zA-Z].+")).ToList();

详细信息:模式^[^a-zA-Z].+将匹配以字母以外的其他字符(大写或小写)开头的字符串。然后,我使用IsMatch方法来查看匹配是否成功。

因此,在您的情况下,您可以将模式组合成这样:

string pattern = alpaPage + ".+";

在使用123选项的情况下,alpaPage应该等于[^a-zA-Z]

结论:使用originalList.Where(s => Regex.IsMatch(s.LastName, @"^[^a-zA-Z].+").ToList();