方法在不应该向列表添加必要行的情况下不向列表添加该行

本文关键字:列表 添加 情况下 不应该 方法 | 更新日期: 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,把一些东西分解成其他东西。