c# - Linq返回下一行有值的当前行
问题描述
我需要处理作为单个 Excel 字符串列提供给我的发票,我已将其转换为List<string>
. 一个简化的示例如下所示。
This is a nothing line
No001 FOO67 368.80
No001 FOO67 17.68
SHORT 12345
在此示例中,我可能需要从以“No”开头的每一行中提取数据——参考(例如 FOO67)和数量(例如 368.80)。但是,如果我遇到以“SHORT”开头的行,这意味着之前的行金额确实是一个调整,并且参考应该是我在“SHORT”行上找到的任何内容,并且金额的符号相反。在上述情况下,我希望提取的数据如下(第一行是列标题):
Reference Amount
FOO67 368.80
12345 -17.68
我找不到使用针对列表的 linq 查询来实现此目的的任何方法。我认为解决方案可能看起来像这样的模型(下面不会解析,因为我添加了“nextline”作为伪代码添加):
var inv = new List<string> { "This is a nothing line", "No001 FOO67 368.80", "No001 FOO67 17.68", "SHORT 123456" };
var myTable = new DataTable();
myTable.Columns.Add("Id", typeof(int));
myTable.Columns.Add("Ref", typeof(string));
myTable.Columns.Add("Amount", typeof(double));
var foo = from l in inv
where (l.Substring(0, 2) == "No" && double.TryParse(l.Split(' ')[2], out i))
select myTable.LoadDataRow(new object[]
{ inv.IndexOf(l)
,nextline.Contains("SHORT")? nextline.Split(' ')[1] : l.Split(' ')[1]
,nextline.Contains("SHORT")? -1:1 * double.Parse(l.Split(' ')[2].Replace(",", "").Replace("-", ""))
}, LoadOption.OverwriteChanges);
有没有一种已知的方法可以从查询的下一行获取值并使用它来决定要返回哪些行?如果是这样,这样做的方法是什么?
解决方案
一个快速而肮脏的解决方案:
void Main()
{
var list = new List<string>
{
"This is a nothing line",
"No001 FOO67 368.80",
"No001 FOO67 17.68",
"SHORT 12345"
};
var invoices = list
.Select((l, i) => new InvoiceData
{
Line = l,
NextLine = i < list.Count - 1 ? list[i + 1] : string.Empty
})
.Where(x => x.Line.StartsWith("No"))
.ToList();
}
public class InvoiceData
{
public string Line { get; set; }
public string NextLine { get; set; }
public bool IsAdjustment => NextLine.StartsWith("SHORT");
public decimal Amount =>
IsAdjustment
? -decimal.Parse(Line.Split(' ')[2])
: decimal.Parse(Line.Split(' ')[2]);
public string Reference =>
IsAdjustment
? NextLine.Split(' ')[1]
: Line.Split(' ')[1];
}
推荐阅读
- docker - 如何在本地访问 nginx 入口?
- c# - 按共同的用户 id linq 对两个列表进行分组
- r - R不会为变量赋值,但不会抛出错误
- cakephp - CakePHP 3.8 - 如何在视图中访问 webroot 的公共路径?
- python - 使用另一个列表和索引列表生成列表
- c - 网络服务器和文件的字节顺序
- python - PyTorch:retain_graph=True 在交替优化中是否必要?
- pyspark - 在pyspark中展平sql.dataframe.DataFrame的数组(不同维度)
- python - 如何将字节数组的一部分复制到 c_void_p 引用的内存,反之亦然?
- python-3.x - 冻结和优化后批量标准化的奇怪行为