每次我的程序在 c# 中 运行 时增加一组值

Increment a set of value each time my program is run in c#

每次我 运行 我的代码并将它们写入日志时,我都必须一致地生成一个事务 ID 列表。它看起来像这样:

String path = @"C:\MyFolder\MyFile.csv";

for (int i = 1; i < 10; i++)
{
    int transactionId = i;
    string TransactionID = transactionId.ToString();

    string date1 = DateTime.Today.ToString("yyyyMMdd");
    string time1 = DateTime.Now.ToString();

    string appendText = TransactionID + ";" + date1 + ";" + time1;
    Environment.NewLine;
    File.AppendAllText(path, appendText);
}

每次我 运行 这将写入 10 行,编号为 1 到 10,但我需要每次都更新事务 ID。所以我 运行 今天的代码行编号为 1 - 10,我 运行 明天的代码行编号应为 11-20。我怎样才能有一个随着每个 运行 递增的通用变量?

非常感谢您!

在程序启动时,从 CSV 文件的最后一行读取最后一个交易 ID。 如果不存在数据,您知道应该从 1 或 0

开始计数

核心问题是你需要知道最后写入的交易ID是什么,为此你需要读入你正在写入的文件并解析最后写入的ID,如果none 存在(或 none 被解析)默认从 0(或 1)开始,像这样:

// Default to 0
var transactionId = 0;
var path = @"C:\MyFolder\MyFile.csv";

// Note ReadLines **not** ReadAllLines
var file = File.ReadLines(path);
var lastWrite = file.Last();

// Try and read the first part of the last line, if it fails just use the default
if (int.TryParse(lastWrite.Split(';')[0], out var lastWrittenId))
    transactionId = lastWrittenId;

var sb = new StringBuilder();
var toWrite = new List<string>();
for (int i = 0; i < 10; i++)
{
    var currentId = transactionId + i;
    var date1 = DateTime.Today.ToString("yyyyMMdd");

    // ...
    
    // Without this check there'd be an empty line at the start of the file
    if (currentId != 0)
        sb.Append(Environment.NewLine);
 
    var logText = $"{currentId};{date1};{...}";
    sb.Append(logText);    
    toWrite.Add(sb.ToString());
    sb.Clear();
}

File.AppendAllLines

仅供参考:您(据我所知)目前在写作时没有追加新行。我还建议您 prepend 新行,这意味着最后一行 应该 始终包含最后写入的条目,这使得解析最后写入的条目更容易更快*


*更快,因为我们不必在提供的 IEnumerable 上调用 Reverse(),我们希望避免这种情况,因为 Reverse() captures the source into an array and as such will stream the entire file into our memory, while using Last() "simply" iterates over the entire thing and returns the last item,这意味着我们没有在内存中缓冲整个文件