我在c#控制台应用程序中有以下代码,在这里我想检查字符串cleanedphone是否以字符串列表内的任何条目结尾:

static List<string> Mylist;
var cleanedphone = new string(phone.Trim().Replace(" ", "").Where(c => char.IsDigit(c)).ToArray());//remove non numeric chars + white spaces
si.status = Mylist.Any(a => cleanedphone.EndsWith(a)) ? "Yes" : "No";


但是在我的情况下,即使Yes不以cleanedphone内的任何条目结尾,.Any()也会返回Mylist。所以有人可以建议吗?
谢谢

最佳答案

问题是由列表中的空字符串引起的。如果输入为空字符串,String.EndsWith将为每个字符串返回true,例如:

"abc".EndsWith("");


返回true。

您必须清理后缀列表,例如:

myList=myList.Where(x=>!String.IsNullOrWhitespace(x)).ToList();


如果您使用存储在静态字段中的正则表达式删除非数字字符,则可以加快并简化代码,例如:

static Regex _cleanup;
static List<string> _suffixes;

static void Initialize(string sourcePath)
{
    _cleanup  = new Regex("\\D");
    _suffixes = File.ReadLines(sourcePath)
                    .Where(x=>!String.IsNullOrWhitespace(x))
                    .ToList();
}

public string CheckPhone(string phone)
{
    var cleanedphone = _cleanup.Replace(phone,"");
    var result = _suffixes.Any(a => cleanedphone.EndsWith(a)) ? "Yes" : "No";
    return result;
}


`File.ReadLines` returns an `IEnumerable<string>` instead of `string[]` which means you don't have to load the entire file before cleaning up the entries

关于c# - 在List.Any()内部使用EndsWith()不能按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58629555/

10-16 04:19