2 回答
TA贡献1799条经验 获得超8个赞
您可以使用以下内容。
var inv = new List<string>
{
"This is a nothing line",
"No001 FOO67 368.80",
"No001 FOO67 17.68",
"SHORT 123456"
};
var filterValidLines = inv.ToLookup(c=>c.StartsWith("No")
||c.StartsWith("SHORT"));
var result = filterValidLines[true].Zip(
filterValidLines[true].Skip(1),
(x,y)=>
{
var subData= x.Split(new []{" "},StringSplitOptions.RemoveEmptyEntries);
var multiplier = y.StartsWith("SHORT")? -1:1;
return new Data{Reference= subData[1], Amount = double.Parse(subData[2]) * multiplier};
});
输出
Reference Amount
FOO67 368.8
FOO67 -17.68
TA贡献1871条经验 获得超8个赞
一个快速而肮脏的解决方案:
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];
}
- 2 回答
- 0 关注
- 112 浏览
添加回答
举报
