首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法将不必要的行添加到列表中时,它不应该这样做。

方法将不必要的行添加到列表中时,它不应该这样做。
EN

Stack Overflow用户
提问于 2015-12-09 18:42:34
回答 1查看 49关注 0票数 0

我是c#的初学者,我正在做文本练习。我做了一个过滤车辆车牌号码的方法。它应该由3个字母和3个整数组成( AAA:152 )。我的方法将错误的车牌号码发送到一个文件,但它也会将这个错误的车牌号码添加到一个好的车牌号码列表中。

代码语言:javascript
运行
复制
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();
}

有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-09 19:32:21

您需要使用量词来约束可能的长度:

代码语言:javascript
运行
复制
^[a-zA-Z]{3}\:\d{3}$

按照严格的顺序,字面意思是:

字符串从3个小写或大写的英文字母开始,以分号(:)继续,以3个数字结束

请记住,在C#中应该对\进行转义。

此外,如果可以使用未拆分的csvLines[i],则无需将stringFields重新连接到字符串中

代码语言:javascript
运行
复制
if (Regex.IsMatch(stringFields, @"^[a-zA-Z]{3}\\:\\d{3}$"))
    toReturn.Add(csvLines[i]);
}
else
{
    toSend.Add(csvLines[i]);
    wrongCount++;
}

另一件重要的事情是你的代码在面向对象方面是不正确的。名为InvalidPlates的方法是否会将某些内容保存到文件中并不明显。过一段时间或其他开发人员,它可能会让您感到困惑。不应该有“隐藏”的功能,所有的方法实际上应该只做一件事。

下面是我如何使用LINQ做到这一点:

代码语言:javascript
运行
复制
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并拆分一些其他的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34176751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档