方法在不应该向列表添加必要行的情况下不向列表添加该行
本文关键字:列表 添加 情况下 不应该 方法 | 更新日期: 2023-09-27 18:26:12
我是c#的初学者,正在进行文本练习。我做了一个过滤车牌号的方法。它应该由3个字母和3个整数组成(AAA:152)。我的方法将错误的车牌号发送到一个文件中,但也会将坏的车牌号添加到好的车牌号列表中。
private static string[] InvalidPlates(string[] csvLines, int fieldToCorrect)
{
var toReturn = new List<string>();
var toSend = new List<string>();
int wrongCount = 0;
for (int i = 0; i < csvLines.Length; i++)
{
string[] stringFields = csvLines[i].Split(csvSeparator[0]);
string[] values = stringFields[fieldToCorrect].Split(':');
if(Regex.IsMatch(values[0], @"^[a-zA-Z]+$") && Regex.IsMatch(values[1], "^[0-9]+$"))
{
toReturn.Add(string.Join(csvSeparator, stringFields));
}
else
{
toSend.Add(string.Join(csvSeparator, stringFields));
wrongCount++;
}
}
WriteLinesToFile(OutputFile, toSend.ToArray(), wrongCount);
return toReturn.ToArray();
}
有人能帮我修一下吗?
您需要使用量词限制可能的长度:
^[a-zA-Z]{3}':'d{3}$
它的字面意思是,按照严格的顺序:
字符串从3个小写或大写英文字母开始,以分号(
:
)结尾,并以3位数字结尾
请记住,'
应该在C#中进行转义。
此外,当您可以使用未拆分的csvLines[i]
:时,不需要将stringFields
连接回字符串
if (Regex.IsMatch(stringFields, @"^[a-zA-Z]{3}'':''d{3}$"))
toReturn.Add(csvLines[i]);
}
else
{
toSend.Add(csvLines[i]);
wrongCount++;
}
另一件重要的事情是,你的代码在OOP方面是不正确的。很明显,名为InvalidPlates
的方法会将某些内容保存到一个文件中。一段时间后,它可能会让你或其他开发人员感到困惑。不应该有"隐藏"的功能,所有方法实际上应该只做一件事。
以下是我使用LINQ:的方法
private static bool IsACorrectPlate(string p) => Regex.IsMatch(p, @"^[a-zA-Z]{3}':'d{3}$");
private static void SortPlatesOut(string[] csvLines, int column, out string[] correct, out string[] incorrect)
{
var isCorrect = csvLines
.GroupBy(l => IsACorrectPlate(l.Split(';')[column]))
.ToDictionary(g => g.Key, g => g.ToArray());
correct = isCorrect[true];
incorrect = isCorrect[false];
}
// Usage:
string[] incorrect, correct;
SortPlatesOut(csvLines, 1, out correct, out incorrect);
File.WriteAllLines("", incorrect);
// do whatever you need with correct
现在,SortPlatesOut
方法具有可预期的行为,没有副作用。代码也缩短了两倍。同时,它对我来说更可读。如果它对你来说不可读,你可以打开LINQ,把一些东西分解成其他东西。