我有以下代码,用于过滤 csv 文件并将第 1 列和第 5 列存储在一个列表(值)中,将第 7 列和第 11 列存储在另一个列表(值1)中。
目的是搜索第一个列表(值)中的每个元素,然后检查第二个列表(值 1)中的每个元素是否有匹配的期间,然后添加所有匹配案例的支出,然后与第一个列表的支出进行比较1% 的误差范围。
以下代码负责使用下面的两个 foreach 循环来搜索每个列表部分。但我在定义变量时遇到问题(即 var temp 不起作用,并给我一个 FormatException 错误:输入字符串的格式不正确。”运行代码时出现错误)以将支出存储或添加到一起事件是第二个列表中多次出现某个句点。
当我定义列表时,是否可以定义变量 Payout 和 period 的类型?问题在于它们是定义变量的匿名变量。
感谢任何帮助,谢谢。
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] 是空字符串,则会失败,而您可能希望将其解释为零。
关于c# - 如何在 LINQ 中比较两个匿名变量列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476610/