我有这个类:
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
是姓氏。 因此,在UI上,我为用户提供了过滤选项列表。喜欢:
- 123
- 一个
- 乙
- 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(...
似乎不需要正则表达式。 如何格式化?!?
谢谢!
我认为正则表达式对此矫枉过正。如注释中所述,对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
你可以试试这个简单的代码:
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();