我有以下代码可过滤csv文件,并将第1列和第5列存储在一个列表(值)中,并将第7列和第11列存储在另一列表(值1)中。
目的是搜索第一个列表中的每个元素(值),然后在添加所有匹配案例的支出之前检查第二个列表中的每个元素(值1)的匹配期间,然后将其与第一个列表的支出进行比较(误差为1%)保证金。
以下代码使用下面的两个foreach循环来处理每个列表部分的搜索。但是我在定义变量时遇到问题(即var temp无法正常工作,并给我一个FormatException错误:输入字符串的格式不正确。”在运行代码时出错),以便将付款存储或添加到一起如果第二个列表中出现多个句点,则表示该事件。
当我定义列表时,是否还可以定义变量支付和期间的类型?问题在于,它们是应该定义的匿名变量。
任何帮助表示赞赏,谢谢。
var values = File.ReadLines(path).Skip(1)
.Select(x => x.Split(','))
.Where(x => x[0] != string.Empty)
.Select(x => new { Period = int.Parse(x[0]), Payout = decimal.Parse(x[4]) })
.ToList();
values = values.OrderBy(x => x.Period)
.ToList();
var values1 = File.ReadLines(path).Skip(1)
.Select(x => x.Split(','))
.Where(x => x[0] == string.Empty)
.Select(x => new { Period = int.Parse(x[6]), Payout = decimal.Parse(x[10]) })
.ToList();
//Console.WriteLine(values1);
values1 = values1.OrderBy(x => x.Period)
.ToList();
//Console.WriteLine(values1[0]);
decimal temp = 0;
foreach (var value in values)
{
foreach (var value1 in values1)
{
if (value.Period == value1.Period)
{
temp += value1.Payout;
}
}
}
FormatException意味着您的某些数据不是您期望的。
您可以使用如下所示的方法来检查无效数据。
int dummyPeriod ;
decimal dummyPayout;
var badValues = File.ReadLines(path).Skip(1)
.Select(x => x.Split(','))
.Where(x => !Int32.TryParse(x[0], out dummyPeriod) ||
!Decimal.TryParse(x[4], out dummyPayout))
.Select(x => new { Period = x[0] , Payout = x[4] })
.ToList();
如果您只想忽略这些行,可以反转选择,例如
var values = File.ReadLines(path).Skip(1)
.Select(x => x.Split(','))
.Where(x => Int32.TryParse(x[0], out dummyPeriod) &&
Decimal.TryParse(x[4], out dummyPayout))
.Select(x => new { Period = int.Parse(x[0]), Payout = decimal.Parse(x[4]) })
.ToList();
注意
decimal.parse(x[4])
如果x [4]为空字符串,将失败,而您可能希望将其解释为零。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句