药物的版本控制
Version control for medications
我需要一些算法方面的帮助。
我正在跟踪患者服用的药物。我最终会得到这样的条目:
1/1/22 DrugA 5mg Started DrugA
1/1/22 DrugB 5mg Started DrugB
1/3/22 DrugA 10mg Increased dosage of DrugA
1/5/22 DrugB 0mg Stopped taking DrugB
据此,我需要能够生成以下内容:
1/1/22 DrugA 5mg; DrugB 5mg
1/2/22 DrugA 5mg; DrugB 5mg
1/3/22 DrugA 10mg; DrugB 5mg
1/4/22 DrugA 10mg; DrugB 5mg
1/5/22 DrugA 10mg
1/6/22 DrugA 10mg
换句话说,从描述药物剂量变化的条目中,我需要能够准确显示在任何给定日期服用的药物和剂量。
它有点像源代码控制版本控制,您可以跟踪更改但可以在任何时间点重现整体。
明确地说,我会将此信息存储在数据库或其他东西中。直接存入内存会更简单
任何人都可以提出可以处理这种情况的算法吗?我需要在 C# 中实现它。
您只给了我们纯文本输入,所以我要组成一个 class 来表示数据。
public class Prescription
{
public DateTime Date { get; set; }
public long PatientNumber { get; set; }
public string DrugName { get; set; }
public decimal DrugAmount { get; set; }
public string Notes { get; set; }
}
假设您有一个特定患者的这些记录的列表,并且您想要生成输出文本。要对此建模,我们需要更多 classes:
public class Administration
{
public DateTime Date { get; set; }
public List<Dosage> Dosages { get; set; }
}
public class Dosage
{
public string DrugName { get; set; }
public decimal DrugAmount { get; set; }
}
您的算法可能如下所示:
var prescriptions = GetPrescriptions(); // Load the list of prescriptions from the database
var administrations = new List<Administration>();
if (prescriptions.Count == 0)
return administrations;
var start = prescriptions[0].Date;
var end = prescriptions[prescriptions.Count - 1].Date;
var date = start;
var dosages = new Dictionary<string, decimal>();
var index = 0;
while (date <= end)
{
// Iterate through all the prescriptions that happened on this day, and update the dosage amounts
while (index < prescription.Count)
{
var prescription = prescriptions[index];
if (prescription.Date != date)
break;
if (prescription.DrugAmount == 0)
dosages.Remove(prescription.DrugName);
else
dosages[prescription.DrugName] = prescription.DrugAmount;
index++;
}
administrations.Add(new Administration
{
Date = date,
Dosages = dosages.Select(pair => new Dosage
{
DrugName = pair.Key,
DrugAmount = pair.Value,
}).ToList(),
});
date += TimeSpan.FromDays(1);
}
return administrations;
为了进一步参考,在高层次上,可以将公认的解决方案视为 CQRS pattern in combination with the event sourcing 模式。
链接中还有一些 C# 代码示例。
我需要一些算法方面的帮助。
我正在跟踪患者服用的药物。我最终会得到这样的条目:
1/1/22 DrugA 5mg Started DrugA
1/1/22 DrugB 5mg Started DrugB
1/3/22 DrugA 10mg Increased dosage of DrugA
1/5/22 DrugB 0mg Stopped taking DrugB
据此,我需要能够生成以下内容:
1/1/22 DrugA 5mg; DrugB 5mg
1/2/22 DrugA 5mg; DrugB 5mg
1/3/22 DrugA 10mg; DrugB 5mg
1/4/22 DrugA 10mg; DrugB 5mg
1/5/22 DrugA 10mg
1/6/22 DrugA 10mg
换句话说,从描述药物剂量变化的条目中,我需要能够准确显示在任何给定日期服用的药物和剂量。
它有点像源代码控制版本控制,您可以跟踪更改但可以在任何时间点重现整体。
明确地说,我会将此信息存储在数据库或其他东西中。直接存入内存会更简单
任何人都可以提出可以处理这种情况的算法吗?我需要在 C# 中实现它。
您只给了我们纯文本输入,所以我要组成一个 class 来表示数据。
public class Prescription
{
public DateTime Date { get; set; }
public long PatientNumber { get; set; }
public string DrugName { get; set; }
public decimal DrugAmount { get; set; }
public string Notes { get; set; }
}
假设您有一个特定患者的这些记录的列表,并且您想要生成输出文本。要对此建模,我们需要更多 classes:
public class Administration
{
public DateTime Date { get; set; }
public List<Dosage> Dosages { get; set; }
}
public class Dosage
{
public string DrugName { get; set; }
public decimal DrugAmount { get; set; }
}
您的算法可能如下所示:
var prescriptions = GetPrescriptions(); // Load the list of prescriptions from the database
var administrations = new List<Administration>();
if (prescriptions.Count == 0)
return administrations;
var start = prescriptions[0].Date;
var end = prescriptions[prescriptions.Count - 1].Date;
var date = start;
var dosages = new Dictionary<string, decimal>();
var index = 0;
while (date <= end)
{
// Iterate through all the prescriptions that happened on this day, and update the dosage amounts
while (index < prescription.Count)
{
var prescription = prescriptions[index];
if (prescription.Date != date)
break;
if (prescription.DrugAmount == 0)
dosages.Remove(prescription.DrugName);
else
dosages[prescription.DrugName] = prescription.DrugAmount;
index++;
}
administrations.Add(new Administration
{
Date = date,
Dosages = dosages.Select(pair => new Dosage
{
DrugName = pair.Key,
DrugAmount = pair.Value,
}).ToList(),
});
date += TimeSpan.FromDays(1);
}
return administrations;
为了进一步参考,在高层次上,可以将公认的解决方案视为 CQRS pattern in combination with the event sourcing 模式。 链接中还有一些 C# 代码示例。