我上了这个课:
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
是姓氏。因此,在用户界面上,我为用户提供了一系列过滤选项。喜欢:
等等如果他们单击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。我该如何格式化?!?
谢谢!
答案 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();