Выполнение List<T>.Remove()
удалит только запись из списка, а не обязательно слово. Это при условии, что текстовый файл имеет больше, чем код элемента в строке. Предполагая, что текстовый файл выглядит примерно так:
Hello world
Да, какой прекрасный день, чтобы поздороваться
Добрый день
Чем вы можете написать следующий код для удаления «Hello»:
string filePath = @"path\to\file.txt";
var lines = File.ReadAllLines(filePath);
string itemCode = "Hello";
// If you don't want the replace to be case insensitive, do line.Replace(itemCode, string.Empty)
var newLines = lines.Select(line => Regex.Replace(line, itemCode, string.Empty, RegexOptions.IgnoreCase));
File.WriteAllLines(filePath, newLines);
Вывод будет:
world
Да, что за прекрасный день это сказать
Добрый день
Если вы хотите удалить строку, содержащую ваш код товара, замените newLine
на:
var newLines = lines.Where(line => !line.Contains(itemCode, StringComparison.OrdinalIgnoreCase));
Какой результат будет
Добрый день
Редактировать
На основании ваших правок вы скорее всего, вы захотите создать модель для представления элементов в вашем текстовом файле, например:
public class Item
{
public Item(string input)
{
var splitInput = input.Split(' ');
Code = splitInput[0];
Qty = int.Parse(splitInput[1]);
}
public Item(string code, int qty)
{
Code = code;
Qty = qty;
}
public string Code { get; }
public int Qty { get; }
public override string ToString()
{
return $"{Code} {Qty}";
}
}
И код будет выглядеть примерно так:
static void Main(string[] args)
{
string filePath = @"path\to\file.txt";
var lines = File.ReadAllLines(filePath).Select(line => new Item(line));
string itemCode = "AP01";
int qty = 25;
var newLines = lines
.Select(item => item.Code == itemCode ? new Item(item.Code, item.Qty - qty) : item)
.Where(item => item.Qty > 0)
.Select(item => item.ToString());
File.WriteAllLines(filePath, newLines);
}
Это уменьшит количество и, если они равны 0 или меньше, удалите их из текстового файла.