如果数据类型不正确,有没有办法在运行时之前检查数据

本文关键字:运行时 检查 数据 不正确 数据类型 有没有 如果 | 更新日期: 2023-09-27 18:34:16

我偶尔会得到不完全干净的数据,在运行时我会收到错误消息,因为数据与预期类型不匹配。 例如,有时数据有一个字符串,其中应该有一个 int,或者有一个 int 应该有一个日期。

有没有办法先扫描数据以查找错误数据,以便我可以一次修复所有数据,而不是在运行时找出并迭代修复它?

这是我的代码

class TestScore{
    public string Name;
    public int Age;
    public DateTime Date;
    public DateTime Time;
    public double Score;
}
//read data
var Data = File.ReadLines(FilePath).Select(line => line.Split(''t')).ToArray();
//select data
var query = from x in Data                     
select new { Name = x[3], Age = x[1], Date = x[2], Time = x[5], Score = x[7] };
//create List and put data into List
List<TestScore> Results = new List<TestScore>();
for (int i = 0; i < query.Count; i++)
{
       TestScore TS = new TestScore();
       TS.Name = query[i].Name;
       TS.Age = query[i].Age;
       TS.Date = query[i].Date;
       TS.Time = query[i].Time;
       TS.Score = query[i].Score;
       Results.Add(TS);
}

如果数据类型不正确,有没有办法在运行时之前检查数据

有没有办法先扫描数据以查找错误数据,以便我可以修复 一次全部完成,而不是在运行时发现并修复它 迭 代?

扫描运行时操作。但是,实施一个解决方案相当简单,该解决方案为您提供足够的信息来"一次修复所有问题"。

以下代码显示了用于验证整个文件的模式,除非完全成功,否则不会尝试加载任何数据。

如果失败,则返回遇到的所有错误的集合。

internal sealed class ParseStatus
{
    internal bool IsSuccess;
    internal IReadOnlyList<string> Messages;
}
private ParseStatus Load()
{
    string filePath = "foo";
    var data = File.ReadLines( filePath ).Select( line => line.Split( ''t' ) ).ToArray();
    var results = from x in data
                    select new { Name = x[3], Age = x[1], Date = x[2], Time = x[5], Score = x[7] };
    var errors = new List<string>();
    int row = 0;
    // first pass: look for errors by testing each value
    foreach( var line in results )
    {
        row++;
        int dummy;
        if( !int.TryParse( line.Age, out dummy ) )
        {
            errors.Add( "Age couldn't be parsed as an int on line " + row );
        }
        // etc...use exception-free checks on each property
    }
    if( errors.Count > 0 )
    {
        // quit, and return errors list
        return new ParseStatus { IsSuccess = false, Messages = errors };
    }
    // otherwise, it is safe to load all rows
    // TODO: second pass: load the data
    return new ParseStatus { IsSuccess = true };
}

为了在运行时不找出错误,我能想到的最好的事情是在程序运行之前手动更正数据

但是当我们尝试做建设性的事情时,我认为使用静态只读字段来指示数据错误会有所帮助。下面是一个简单的示例,它不采用失败的项目,当您要执行一些高级处理时,您可能需要修改它。

public partial class TestScore {
    public static TestScore Parse(String plainText) {
        var strings=plainText.Split(''t');
        var result=new TestScore();
        if(
            strings.Length<5
            ||
            !double.TryParse(strings[4], out result.Score)
            ||
            !DateTime.TryParse(strings[3], out result.Time)
            ||
            !DateTime.TryParse(strings[2], out result.Date)
            ||
            !int.TryParse(strings[1], out result.Age)
            )
            return TestScore.Error;
        result.Name=strings[0];
        return result;
    }
    public String Name;
    public int Age;
    public DateTime Date;
    public DateTime Time;
    public double Score;
    public static readonly TestScore Error=new TestScore();
}
public static partial class TestClass {
    public static void TestMethod() {
        var path=@"some tab splitted file";
        var lines=File.ReadAllLines(path);
        var format=""
            +"Name: {0}; Age: {1}; "
            +"Date: {2:yyyy:MM:dd}; Time {3:hh:mm}; "
            +"Score: {4}";
        var list=(
            from line in lines
            where String.Empty!=line
            let result=TestScore.Parse(line)
            where TestScore.Error!=result
            select result).ToList();
        foreach(var item in list) {
            Console.WriteLine(
                format,
                item.Name, item.Age, item.Date, item.Time, item.Score
                );
        }
    }
}