C# 如果我们将数据存储在.txt文件中,如何验证和返回数据?

C# 如果我们将数据存储在.txt文件中,如何验证和返回数据?,c#,streamreader,C#,Streamreader,我有一个记事本(.txt)文件,它有三个字段,即ID名称和位置。我想使用streamreader在C#中读取这些数据,并检查文件中是否存在ID。如果是,我应该将该行作为输出else错误获取 假设我有下面的txt文件,其中的字段为 00125 JAMES LONDON 00127 STARK USA 00128 ARNOLD AUSTRALIA 现在,我应该要求用户输入该ID。如果ID匹配,那么我应该将该特定行作为输出。例如,如果用户输入00127,那么我应该得到输出 00127 JA

我有一个记事本(.txt)文件,它有三个字段,即ID名称和位置。我想使用streamreader在C#中读取这些数据,并检查文件中是否存在ID。如果是,我应该将该行作为输出else错误获取

假设我有下面的txt文件,其中的字段为

00125  JAMES  LONDON
00127  STARK  USA
00128  ARNOLD AUSTRALIA
现在,我应该要求用户输入该ID。如果ID匹配,那么我应该将该特定行作为输出。例如,如果用户输入00127,那么我应该得到输出

00127 JAMES LONDON
我知道如果数据存储在数据库中,这将非常简单。但如果数据存储在.txt文件中会怎样呢


提前感谢

您可以使用
StreamReader
从文件中读取内容

然后,您可以使用
split
拆分
字符串

这样,您就可以在二维数组中添加所有项。然后数组看起来像
{{00125,詹姆斯,伦敦},{00127,斯塔克,美国},{00128,阿诺德,澳大利亚}
。使用它,您可以将输入与每个数组的第一个条目进行比较,并相应地返回数据


这应该给你一个清晰的方向,从现在开始

有几个选项:

  • 每次你接到请求都要看那该死的文件。如果文件很小并且请求不频繁,这将很好地工作。您逐行阅读,并将
    id
    与用户的
    id
    进行比较。实现起来真的很快,但在资源利用方面却非常愚蠢。运行时复杂性为O(N)-在最坏的情况下,您需要扫描整个文件

  • 您可以修改第一个选项并添加一层缓存。如果您经常查询相同的
    id
    ,您将获得很好的性能提升。运行时复杂性仍然是O(N)-在最坏的情况下,您需要扫描整个文件。而这还远远不够快

  • 您还可以尝试对文件
    ids
    进行一次排序。使用最佳算法,这将花费
    O(N x Log(N)
    时间,即您一次预处理数据所花费的时间。但是,任何读取查询都可以在
    O(Log(N))
    中执行,使用基于
    id
    的二进制搜索

如果您要查找代码片段,我会搜索
StreamReader
TextReader
StreamWriter
二进制搜索
快速排序
。在野外有很多示例…

最简单的解决方案(假设您有固定的ID格式-五位数):

创建以行作为值和ID作为键的字典。用法:

string line = users["00125"]; // 00125  JAMES  LONDON

这是最简单的解决方案。但实际上,我要介绍一些类,如:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }

    public static User Parse(string s)
    {
        var parts = s.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);
        return new User {
            Id = Int32.Parse(parts[0]),
            Name = parts[1],
            Location = parts[2]
        };
    }

    public override string ToString()
    {
        return String.Format("{0:00000} {1} {2}", Id, Name, Location);
    }
}
然后解析每一行并将用户放入类型为
dictionary
的dictionary。这将使您的代码具有强类型并易于维护:

var users = File.ReadAllLines("data.txt")
                .Select(line => User.Parse(line))
                .ToDictionary(u => u.Id);

var user = users[127];
string name = user.Name; // STARK
Console.WriteLine(user); // 00127 STARK USA

你试过什么?你自己研究过吗?还有:是所有的东西都在一行中,还是ID名称和位置在一行中,然后下一个ID名称和位置在下一行中?在任何情况下,
String.Split(“”)
,这可能是相关的-
var users = File.ReadAllLines("data.txt")
                .Select(line => User.Parse(line))
                .ToDictionary(u => u.Id);

var user = users[127];
string name = user.Name; // STARK
Console.WriteLine(user); // 00127 STARK USA